Verwendung von HAVING ohne GROUP BY in SQL-Abfragen


26

HAVINGMuss es für die Verwendung in SQL-Abfragen eine geben, GROUP BYum die Spaltennamen zu aggregieren?

Gibt es spezielle Fälle, in denen es möglich ist, HAVINGohne GROUP BYSQL-Abfragen zu verwenden?

Müssen sie gleichzeitig existieren?

Antworten:


25

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 wheredurch 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 havingeinfach eine Kurzversion dieser letzten Abfrage ist.


Zusammenfassend havingwird nach der group byPhase whereangewendet, wohingegen vor der group byPhase angewendet wird.


2
Ein weiteres Beispiel:SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
— ypercubeᵀᴹ

1
Ja. Und PostgreSQL erlaubt das folgende Konstrukt, select 1 having count(*) = 1;das ich noch nicht verstanden habe.
— Colin 't Hart

SQL Server erlaubt auch, SELECT 1 AS id, 'Colin' AS name;während andere wie Oracle eine spezielle dualTabelle haben. Ich glaube nicht, dass eine dieser Syntaxen ANSI / ISO SQL ist (was erfordert FROM).
— ypercubeᵀᴹ

Ich habe nicht das Fehlen gemeint, fromsondern den Verweis auf count(*)in der havingKlausel ohne Angabe darüber, über welche Spalten dies aggregiert wird. Vermutlich aggregiert es über alle Spalten in der selectKlausel.
— Colin 't Hart

Ach ok Ja, ich bin damit einverstanden, dass es das ist, was es tut (aggregieren Sie über alle Zeilen, die Sie meinen - über alle Zeilen einer leeren Tabelle).
— ypercubeᵀᴹ


1

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.


1

In Abwesenheit der GROUP BY-Klausel betrachtet die Abfrage die gesamte Beziehung als eine Gruppe.

z.B

     select count(*)
     from dual
     having count(*) > 5;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.