Czy w celu użycia HAVING
w zapytaniach SQL musi istnieć GROUP BY
agregacja nazw kolumn?
Czy są jakieś specjalne przypadki, w których można używać HAVING
bez GROUP BY
zapytań SQL?
Czy muszą one współistnieć w tym samym czasie?
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ć where
ze having
w 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 having
jest po prostu skróconą wersją tego ostatniego zapytania.
Podsumowując, having
jest stosowana pogroup by
faza natomiast where
jest stosowany przed tym group by
etapie.
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
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ądual
tabelę. Nie sądzę, aby któraś z tych składni była ANSI / ISO SQL (która wymagaFROM
).from
Jednak odniesienie docount(*)
whaving
klauzuli bez wskazania co do tego, na które kolumny jest sumowane. Przypuszczalnie agreguje się we wszystkich kolumnach wselect
klauzuli.Posłuży do filtrowania grup.
gdzie klauzula służy do filtrowania wierszy.
źródło
having
jest stosowany po fazie agregacji, więc można go użyć do filtrowania grup.POSIADA filtrowanie grup. Jeśli nie masz przyczyny GROUP BY, wszystkie wiersze przedstawiają jedną grupę. Tak więc, jeśli predykat w HAVING ma wartość true, otrzymasz jeden wiersz, w przeciwnym razie nie będzie żadnych wierszy.
źródło
W przypadku braku klauzuli GROUP BY zapytanie traktuje całą relację jako jedną grupę.
na przykład
źródło