Czy w celu użycia HAVINGw zapytaniach SQL musi istnieć GROUP BYagregacja nazw kolumn?
Czy są jakieś specjalne przypadki, w których można używać HAVINGbez GROUP BYzapytań SQL?
Czy muszą one współistnieć w tym samym czasie?
Czy w celu użycia HAVINGw zapytaniach SQL musi istnieć GROUP BYagregacja nazw kolumn?
Czy są jakieś specjalne przypadki, w których można używać HAVINGbez GROUP BYzapytań SQL?
Czy muszą one współistnieć w tym samym czasie?
Odpowiedzi:
Nie.
Nie muszą one współistnieć, o czym świadczy fakt, że działa następujące zapytanie w Oracle:
select * from dual having 1 = 1;
Podobnie w PostgreSQL działa następujące zapytanie:
select 1 having 1 = 1;
Więc having nie wymaga group by .
Opcja jest stosowana po fazie agregacji i należy jej użyć, jeśli chcesz filtrować wyniki agregacji. Więc odwrotna sytuacja nie jest prawdą, a następujące działania nie będą działać:
select a, count(*) as c
from mytable
group by a
where c > 1;
Trzeba wymienić whereze havingw tym przypadku, jak następuje:
select a, count(*) as c
from mytable
group by a
having c > 1;
Uwaga: będzie również działał następujący formularz zapytania:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Widać, że użycie havingjest po prostu skróconą wersją tego ostatniego zapytania.
Podsumowując, havingjest stosowana pogroup by faza natomiast wherejest stosowany przed tym group byetapie.
select 1 having count(*) = 1;którą muszę jeszcze zrozumieć.
SELECT 1 AS id, 'Colin' AS name;podczas gdy inni, tacy jak Oracle, mają specjalną dualtabelę. Nie sądzę, aby któraś z tych składni była ANSI / ISO SQL (która wymaga FROM).
fromJednak odniesienie do count(*)w havingklauzuli bez wskazania co do tego, na które kolumny jest sumowane. Przypuszczalnie agreguje się we wszystkich kolumnach w selectklauzuli.
Posłuży do filtrowania grup.
gdzie klauzula służy do filtrowania wierszy.
havingjest stosowany po fazie agregacji, więc można go użyć do filtrowania grup.
W przypadku braku klauzuli GROUP BY zapytanie traktuje całą relację jako jedną grupę.
na przykład
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);