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?
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?
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ć 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 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 wymaga FROM
).
from
Jednak odniesienie do count(*)
w having
klauzuli bez wskazania co do tego, na które kolumny jest sumowane. Przypuszczalnie agreguje się we wszystkich kolumnach w select
klauzuli.
Posłuży do filtrowania grup.
gdzie klauzula służy do filtrowania wierszy.
having
jest 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);