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?
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 MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
select 1 having count(*) = 1;
das ich noch nicht verstanden habe.SELECT 1 AS id, 'Colin' AS name;
während andere wie Oracle eine spezielledual
Tabelle haben. Ich glaube nicht, dass eine dieser Syntaxen ANSI / ISO SQL ist (was erfordertFROM
).from
sondern den Verweis aufcount(*)
in derhaving
Klausel ohne Angabe darüber, über welche Spalten dies aggregiert wird. Vermutlich aggregiert es über alle Spalten in derselect
Klausel.Mit wird nach Gruppen gefiltert.
Mit der where-Klausel werden Zeilen gefiltert.
quelle
having
wird angewendet , nachdem die Aggregationsphase so kann verwendet werden Filtergruppen.HAVING filtert die Gruppen. Wenn Sie keine GROUP BY-Ursache haben, wird in allen Zeilen eine Gruppe angezeigt. Wenn also das Prädikat in HAVING als wahr ausgewertet wird, erhalten Sie eine Zeile, andernfalls keine Zeilen.
quelle
In Abwesenheit der GROUP BY-Klausel betrachtet die Abfrage die gesamte Beziehung als eine Gruppe.
z.B
quelle