Ich muss falsch googeln oder ich habe einen dummen Moment in der Zeit.
Was ist der Unterschied zwischen HAVING
und WHERE
in einer SQL SELECT
Aussage?
EDIT: Ich habe Stevens Antwort als die richtige markiert, da sie die wichtigsten Informationen auf dem Link enthielt:
Wenn
GROUP BY
nicht verwendet,HAVING
verhält es sich wie eineWHERE
Klausel
Die Situation, die ich gesehen hatte, WHERE
hatte nicht GROUP BY
und hier begann meine Verwirrung. Bis Sie dies wissen, können Sie es natürlich nicht in der Frage angeben.
HAVING
, währendWHERE
es sich um einen Voraggregationsfilter handelt .Antworten:
Quelle
quelle
HAVING: wird verwendet, um die Bedingungen nach der Aggregation zu überprüfen .
WO: wird verwendet, um die Bedingungen zu überprüfen, bevor die Aggregation stattfindet.
Dieser Code:
Gibt Ihnen eine Tabelle aller Städte in MA und die Anzahl der Adressen in jeder Stadt.
Dieser Code:
Gibt Ihnen eine Tabelle mit Städten in MA mit mehr als 5 Adressen und der Anzahl der Adressen in jeder Stadt.
quelle
Der größte Unterschied für mich: Wenn
HAVING
er aus der SQL-Sprache entfernt würde, würde das Leben mehr oder weniger so weitergehen wie zuvor. Sicherlich müssten Minderheitsabfragen unter Verwendung einer abgeleiteten Tabelle, eines CTE usw. neu geschrieben werden, aber sie wären wahrscheinlich leichter zu verstehen und zu pflegen. Möglicherweise müsste der Optimierungscode der Anbieter neu geschrieben werden, um dies zu berücksichtigen. Dies ist wiederum eine Gelegenheit zur Verbesserung innerhalb der Branche.Betrachten Sie nun für einen Moment das Entfernen
WHERE
aus der Sprache. Diesmal müsste die Mehrzahl der vorhandenen Abfragen ohne ein offensichtliches alternatives Konstrukt neu geschrieben werden. Codierer müssten kreativ werden, z. B. innerer Join zu einer Tabelle, von der bekannt ist, dass sie genau eine Zeile enthält (z. B.DUAL
in Oracle), indem sie dieON
Klausel verwenden, um die vorherigeWHERE
Klausel zu simulieren . Solche Konstruktionen würden erfunden; Es wäre offensichtlich, dass etwas in der Sprache fehlte und die Situation sich dadurch verschlechtern würde.TL; DR könnten wir
HAVING
morgen verlieren und die Dinge wären nicht schlechter, möglicherweise besser, aber das Gleiche kann man nicht sagenWHERE
.Aus den Antworten hier geht hervor, dass viele Leute nicht erkennen, dass eine
HAVING
Klausel ohneGROUP BY
Klausel verwendet werden kann. In diesem Fall wird dieHAVING
Klausel auf den gesamten Tabellenausdruck angewendet und erfordert, dass nur Konstanten in derSELECT
Klausel erscheinen. In der Regel umfasst dieHAVING
Klausel Aggregate.Dies ist nützlicher als es klingt. Betrachten Sie diese Abfrage beispielsweise, um zu testen, ob die
name
Spalte für alle Werte inT
: eindeutig ist.Es gibt nur zwei mögliche Ergebnisse: Wenn die
HAVING
Klausel wahr ist, ist das Ergebnis eine einzelne Zeile, die den Wert enthält1
, andernfalls ist das Ergebnis die leere Menge.quelle
Die HAVING-Klausel wurde zu SQL hinzugefügt, da das Schlüsselwort WHERE nicht mit Aggregatfunktionen verwendet werden konnte.
Weitere Informationen finden Sie unter diesem Link zu w3schools
Syntax:
Eine Abfrage wie diese:
... kann unter Verwendung einer abgeleiteten Tabelle (und Weglassen der
HAVING
) wie folgt umgeschrieben werden :quelle
HAVING
wurde hinzugefügt, weil abgeleitete Tabellen nicht zur Sprache hinzugefügt wurden und bis sie SQL waren, nicht relational vollständig waren und sobald sie unvermeidlichHAVING
überflüssig wurden.Der Unterschied zwischen den beiden liegt in der Beziehung zur GROUP BY-Klausel:
WO kommt vor GROUP BY; SQL wertet die WHERE-Klausel aus, bevor Datensätze gruppiert werden.
HAVING kommt nach GROUP BY; SQL wertet HAVING aus, nachdem Datensätze gruppiert wurden.
Verweise
SQLite SELECT-Anweisungssyntax / Eisenbahndiagramm
Informix SELECT-Anweisungssyntax / Eisenbahndiagramm
quelle
SELECT 1 AS result FROM T HAVING...
- In Ihrem Diagramm komme ich nicht durch,HAVING
ohne durchzugehen,GROUP BY
aber meine vollkommen gültige und nützliche Abfrage hat keineGROUP BY
. Kleiner Punkt: Sie haben nicht die Möglichkeit, Literalwerte in dieSELECT
Klausel aufzunehmen.WHERE->HAVING
Teil, daher denke ich, dass es viel Liebe zum Detail verdient. Wenn Sie der Meinung sind, dass meine Antwort falsch ist, bearbeiten Sie sie oder veröffentlichen Sie eine vorgeschlagene Korrektur in den Kommentaren.HAVING
wird verwendet, wenn Sie ein Aggregat wie zGROUP BY
.quelle
WHERE wird als Einschränkung für den von SQL zurückgegebenen Satz angewendet. Es verwendet die in SQL integrierten Set-Oeprations und -Indizes und ist daher der schnellste Weg, um Ergebnismengen zu filtern. Verwenden Sie immer WO, wann immer dies möglich ist.
Für einige Aggregatfilter ist HAVING erforderlich. Es filtert die Abfrage, nachdem SQL die Ergebnisse abgerufen, zusammengestellt und sortiert hat. Daher ist es viel langsamer als WHERE und sollte vermieden werden, außer in den Situationen, in denen es erforderlich ist.
Mit SQL Server können Sie HAVING auch dann verwenden, wenn WHERE viel schneller ist. Tu es nicht.
quelle
Die WHERE-Klausel, die für Aggregatfunktionen nicht funktioniert,
bedeutet: Sie sollten diesen Bonus nicht wie folgt verwenden: Tabellenname
HIER Anstatt die WHERE-Klausel zu verwenden, müssen Sie HAVING verwenden.
Ohne die GROUP BY-Klausel funktioniert die HAVING-Klausel nur als WHERE-Klausel
quelle
Unterschied s / w
WHERE
undHAVING
Klausel:Der Hauptunterschied zwischen
WHERE
undHAVING
-Klausel besteht darin, dassWHERE
sie für Zeilenoperationen undHAVING
für Spaltenoperationen verwendet wird.Warum brauchen wir eine
HAVING
Klausel?Wie wir wissen, können Aggregatfunktionen nur für Spalten ausgeführt werden, daher können wir in
WHERE
Klausel keine Aggregatfunktionen verwenden . Daher verwenden wir Aggregatfunktionen inHAVING
Klausel.quelle
In einer Aggregatabfrage (Jede Abfrage, bei der eine Aggregatfunktion verwendet wird) werden Prädikate in einer where-Klausel ausgewertet, bevor die aggregierte Zwischenergebnismenge generiert wird.
Prädikate in einer Have-Klausel werden auf die aggregierte Ergebnismenge angewendet, nachdem sie generiert wurde. Aus diesem Grund müssen Prädikatbedingungen für Aggregatwerte in der Have-Klausel und nicht in der Where-Klausel platziert werden. Außerdem können Sie Aliase verwenden, die in der Select-Klausel in einer Have-Klausel definiert sind, jedoch nicht in einer Where-Klausel.
quelle
Ich hatte ein Problem und fand einen weiteren Unterschied zwischen
WHERE
und herausHAVING
. Bei indizierten Spalten funktioniert dies nicht auf die gleiche Weise.WHERE my_indexed_row = 123
zeigt Zeilen an und führt automatisch einen "ORDER ASC" für andere indizierte Zeilen durch.HAVING my_indexed_row = 123
zeigt alles von der ältesten "eingefügten" Zeile bis zur neuesten, keine Bestellung.quelle
Wenn
GROUP BY
nicht verwendet, sind die KlauselnWHERE
undHAVING
im Wesentlichen gleichwertig.Wann
GROUP BY
wird jedoch verwendet:WHERE
Klausel wird verwendet, um Datensätze aus einem Ergebnis zu filtern. Die Filterung erfolgt, bevor Gruppierungen vorgenommen werden.HAVING
Klausel wird verwendet, um Werte aus einer Gruppe zu filtern (dh um Bedingungen zu überprüfen, nachdem eine Aggregation in Gruppen durchgeführt wurde).Ressource von hier
quelle
Eine Möglichkeit, sich das vorzustellen, ist, dass die have-Klausel ein zusätzlicher Filter zur where-Klausel ist.
Eine WHERE- Klausel filtert Datensätze aus einem Ergebnis. Der Filter wird ausgeführt, bevor Gruppierungen vorgenommen werden. Eine HAVING- Klausel wird verwendet, um Werte aus einer Gruppe zu filtern
quelle
Von hier aus .
im Gegensatz zu der WHERE-Klausel, die auf Datenbankzeilen angewendet wird
quelle
HAVING
Jahrzehnte haben, nachdem er durch abgeleitete Tabellen "veraltet" wurde.SELECT 1 FROM T HAVING COUNT(*) >= 1;
- verweist nicht auf Spalten in derGROUP BY
Klausel (es gibt keine) oder Spalten in aggregierten Funktionen (Abfrage verweist überhaupt nicht auf Spalten).Bei der Arbeit an einem Projekt war dies auch meine Frage. Wie oben angegeben, überprüft HAVING die Bedingung für das bereits gefundene Abfrageergebnis. Aber WO dient zum Überprüfen der Bedingung, während die Abfrage ausgeführt wird.
Lassen Sie mich ein Beispiel geben, um dies zu veranschaulichen. Angenommen, Sie haben eine solche Datenbanktabelle.
Angenommen, die folgenden Zeilen befinden sich in der Tabelle:
Jetzt wollen wir das
userid
s bekommen undsum(dailyincome)
wessensum(dailyincome)>100
Wenn wir schreiben:
Dies wird ein Fehler sein. Die richtige Abfrage wäre:
quelle
Die WHERE-Klausel wird zum Vergleichen von Werten in der Basistabelle verwendet, während die HAVING-Klausel zum Filtern der Ergebnisse von Aggregatfunktionen in der Ergebnismenge der Abfrage verwendet werden kann. Klicken Sie hier !
quelle
Ich benutze HAVING, um eine Abfrage basierend auf den Ergebnissen einer Aggregatfunktion einzuschränken. ZB wählen Sie * in der blahblahblah-Gruppe aus, indem ETWAS zählt (ETWAS)> 0
quelle
Es kann nur sein, dass das Thema "wo" eine Zeile ist, während das Thema "haben" eine Gruppe ist. Habe ich recht?
quelle