HAVING
Muss es für die Verwendung in SQL-Abfragen eine geben, GROUP BY
um die Spaltennamen zu aggregieren?
Gibt es spezielle Fälle, in denen es möglich ist, HAVING
ohne GROUP BY
SQL-Abfragen zu verwenden?
Müssen sie gleichzeitig existieren?
HAVING
Muss es für die Verwendung in SQL-Abfragen eine geben, GROUP BY
um die Spaltennamen zu aggregieren?
Gibt es spezielle Fälle, in denen es möglich ist, HAVING
ohne GROUP BY
SQL-Abfragen zu verwenden?
Müssen sie gleichzeitig existieren?
Antworten:
Nein.
Sie müssen nicht koexistieren, wie die Tatsache belegt, dass die folgende Abfrage in Oracle funktioniert:
select * from dual having 1 = 1;
In ähnlicher Weise funktioniert in PostgreSQL die folgende Abfrage:
select 1 having 1 = 1;
Also having
nicht erforderlich group by
.
Nachdem wird angewendet , nachdem die Aggregation Phase und muss verwendet werden , wenn Sie aggregierte Ergebnisse filtern möchten. Das Gegenteil ist also nicht der Fall, und Folgendes wird nicht funktionieren:
select a, count(*) as c
from mytable
group by a
where c > 1;
Sie müssen in diesem Fall wie folgt ersetzen where
durch having
:
select a, count(*) as c
from mytable
group by a
having c > 1;
Hinweis: Das folgende Abfrageformular funktioniert auch:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Sie können sehen, dass using having
einfach eine Kurzversion dieser letzten Abfrage ist.
Zusammenfassend having
wird nach der group by
Phase where
angewendet, wohingegen vor der group by
Phase angewendet wird.
select 1 having count(*) = 1;
das ich noch nicht verstanden habe.
SELECT 1 AS id, 'Colin' AS name;
während andere wie Oracle eine spezielle dual
Tabelle haben. Ich glaube nicht, dass eine dieser Syntaxen ANSI / ISO SQL ist (was erfordert FROM
).
from
sondern den Verweis auf count(*)
in der having
Klausel ohne Angabe darüber, über welche Spalten dies aggregiert wird. Vermutlich aggregiert es über alle Spalten in der select
Klausel.
Mit wird nach Gruppen gefiltert.
Mit der where-Klausel werden Zeilen gefiltert.
having
wird angewendet , nachdem die Aggregationsphase so kann verwendet werden Filtergruppen.
In Abwesenheit der GROUP BY-Klausel betrachtet die Abfrage die gesamte Beziehung als eine Gruppe.
z.B
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);