Einführung in die SQL HAVING-Klausel

Die grundlegende Frage, die in den Sinn kommt, ist, was ist diese HAVING-Klausel? Nun, die HAVING-Klausel wird verwendet, um die Ergebnisse einer SQL-Abfrage mit Aggregatfunktionen herauszufiltern. Um es in einfachem Englisch zu verstehen, befiehlt es dem SQL-Parser "Hey SQL, holt mir aus unserer Kundendaten-Tabelle die Namen von Ländern mit mehr als 1 Million Kunden".

Warten Sie, das ist es, was die WHERE-Klausel tut, nicht wahr? Ja, das ist sehr ähnlich wie die WHERE-Klausel, aber mit einem kleinen Unterschied. Die WHERE-Klausel funktioniert nicht mit Aggregatfunktionen.

Um die Aggregatfunktionen noch einmal kurz zusammenzufassen: Dies sind Funktionen, die mehrere Zeilen als Eingabe verwenden und eine signifikantere verarbeitete Ausgabe liefern. Einige Beispiele sind Count (), Sum (), Min (), Max (), Avg () usw.

Warum HABEN und nicht WO?

Wir sehen, dass die HAVING- und WHERE-Klauseln eine sehr ähnliche Aufgabe ausführen, um die Ergebnisse herauszufiltern. Was war dann die Notwendigkeit für die HAVING-Klausel? Warum konnte die WHERE-Klausel nicht mit Aggregatfunktionen verwendet werden?

Um dies zu beantworten, müssen wir verstehen, wie die SQL-Engine die beiden Klauseln behandelt. Die FROM-Klausel in jedem SQL-Befehl teilt der Engine mit, von wo die Zeilen gelesen werden sollen. Die Daten werden auf der Festplatte gespeichert und zur Verarbeitung in den Speicher abgerufen. Wenn die Zeilen einzeln von der Festplatte in den Speicher gelesen werden, werden sie auf die WHERE-Klausel überprüft. Die Zeilen, die die WHERE-Klausel nicht erfüllen, werden nicht in den Speicher geladen. Daher wird die WHERE-Klausel für jede Zeile ausgewertet, während sie von der SQL-Engine verarbeitet wird.

Im Gegenteil, die HAVING-Klausel wird erst sichtbar, nachdem die Zeilen in den Speicher geladen wurden. Sobald sie in den Speicher geladen sind, führen die Aggregatfunktionen ihre Aufgabe in den Zeilen mit der gewünschten Bedingung aus.

Wenn wir nun eine WHERE-Klausel mit der Aggregatfunktion wie avg () einfügen würden, würde dies die SQL-Engine verwirren, ob die Zeile zur Berechnung des Durchschnitts einbezogen werden soll oder nicht. Im Wesentlichen würden wir der Engine befehlen, die Zeile nicht zu lesen, da sie die avg () - Kriterien in der WHERE-Klausel nicht erfüllt. Um jedoch festzustellen, ob die avg () - Berechnungskriterien erfüllt wurden oder nicht, muss die Zeile in den Speicher eingelesen werden. Ein Zustand der Sackgasse.

Die Syntax

SELECT
FROM


WO - optional
GROUP BY - gruppiert die Zeilen, um die Aggregatfunktion anzuwenden
HAVING - Aggregatfunktion in der Bedingung
SORTIEREN NACH ; - Definieren Sie die Sortierreihenfolge, optional

Hinweis - Für die HAVING-Klausel ist die GROUP BY-Klausel erforderlich. Dies liegt daran, dass die Having-Klausel eine Gruppe von Daten benötigt, um eine Aggregatfunktion anzuwenden und die Ergebnisse herauszufiltern.

Wie funktioniert die HAVING-Klausel?

Lassen Sie uns die Funktionsweise der HAVING-Klausel in SQL verstehen.

Die HAVING-Klausel wird immer von der GROUP BY-Klausel begleitet. Die GROUP BY-Klausel fasst die Daten zusammen, die einem bestimmten Kriterium entsprechen. Es besteht aus drei Phasen: Teilen, Anwenden und Kombinieren. Die Split-Phase unterteilt die Zeilen in Gruppen. In der Apply-Phase werden einige Aggregatfunktionen auf die Datengruppen angewendet. Die kombinierte Phase erzeugt ein einzelnes Ergebnis, indem die Gruppen mit dem Ergebnis der aggregierten Funktion kombiniert werden.

Mit der Bildung der Gruppen kommt die HAVING-Klausel ins Spiel. Die HAVING-Klausel filtert dann die Gruppen heraus, die die gegebene Bedingung nicht erfüllen.

SELECT Col_A, avg(Col_B) as Col_B
FROM MyTable
GROUP BY Col_A
HAVING avg(Col_B)>30

Im obigen Beispiel sehen wir also, dass die Tabelle zuerst in drei Gruppen aufgeteilt wird, basierend auf der Spalte Col_A. Die Aggregatfunktion zur Berechnung des Durchschnitts der Col_B-Werte wird dann auf die Gruppen angewendet. Dies führt zu einer einzelnen Zeile für jede Gruppe. Die Zeilen werden dann basierend auf der Bedingung in der HAVING-Klausel kombiniert und gefiltert.

Beispiel

Schauen wir uns nun ein Beispiel aus der Praxis an. Beachten Sie, dass wir die folgende Kundentabelle und die Bestellungen haben, die sie bei uns aufgegeben haben.

KundennummerKundennameStadtLand
1Anja DamianBerlinDeutschland
2Denny CockettMexiko dfMexiko
3Eleanor CalnanMexiko dfMexiko
4Albertha AlburyLondonVereinigtes Königreich
5Latisha NembhardLuleåSchweden
6Madalene BingMannheimDeutschland
7Rebecka BeegleStraßburgFrankreich
8Rosiger TippieMadridSpanien
9Audie KhanMarseilleFrankreich
10Hildegard BurrowesTsawassenKanada
11Cordell DutrembleLondonVereinigtes Königreich
12Nora ReynaBuenos AiresArgentinien
13Ursula LaforestMexiko dfMexiko
14Claudie NeelBernSchweiz
15Portia YeeSão PauloBrasilien
16Angila SegarraLondonVereinigtes Königreich
17Lise WexlerAachenDeutschland
18Ned MendivilNantesFrankreich
19Sara VidaurriLondonVereinigtes Königreich
20Tayna NavinGrazÖsterreich
21Pura RaySão PauloBrasilien
22Erika ByardMadridSpanien
23Jimmie LukeLilleFrankreich
24Shayla ByingtonBräckeSchweden
25Christiana BodenMünchenDeutschland
26Irina NittaNantesFrankreich
27Bryanna AllsTurinItalien
28Norah PickenLisboaPortugal
29Moriah StwartBarcelonaSpanien
30Idella HarriottSevillaSpanien
AuftragsnummerKundennummerBestelldatum
102541411-07-1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278512-08-1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
10297704.09.1996
103033011.09.1996
10308218.09.1996
103111820.09.1996
10326810-10-1996
103272411-10-1996
103282814-10-1996
10331916-10-1996
103372524.10.1996
10340929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
103522812-11-1996
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
103701403-12-1996
103782410-12-1996
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342403-02-1997
104351604-02-1997
10436705-02-1997
104422011-02-1997

Jetzt möchten wir wissen, aus welchen Ländern Kunden insgesamt 5 oder mehr Bestellungen bei uns aufgegeben haben. Es kann sich um einen einzelnen Kunden handeln, der mehr als 5 Bestellungen aufgibt, oder um 5 Kunden, die jeweils 1 Bestellung aufgeben.

Um dies zu erreichen, müssten wir

Schritt 1 : Verbinden Sie die beiden Tabellen

Schritt 2: Gruppieren Sie die Kunden nach Ländern

Schritt 3: Zählen Sie die Anzahl der Bestellungen für jede Gruppe

Schritt 4: Filtern Sie die Ergebnisse für 5 oder mehr Bestellungen

Formulieren wir den Befehl:

SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC

Hier sind die Ergebnisse:

LandAnzahl der Bestellungen
Österreich10
Frankreich9
Schweden7
Deutschland6
Vereinigtes Königreich6

Schlussfolgerung - SQL HAVING-Klausel

Wir haben also gesehen, wozu die HAVING-Klausel dient und wie sie funktioniert. Es ist wichtig, die grundlegende Funktionsweise zu verstehen, da Sie sonst verwirrt werden, warum die HAVING-Klausel nicht die gewünschten Ergebnisse liefert. Spielen Sie weiter mit verschiedenen Tischen, Verknüpfungen und Kombinationen zusammen mit der HAVING-Klausel.

Empfohlene Artikel

Dies ist eine Anleitung zur SQL HAVING-Klausel. Hier diskutieren wir die Arbeitsweise der HAVING-Klausel in SQL und ein Beispiel mit der folgenden Kundentabelle. Sie können auch unsere anderen Artikelvorschläge durchgehen -

  1. SQL-Einfügeabfrage
  2. Fremdschlüssel in SQL
  3. Eindeutiges Schlüsselwort in SQL
  4. SQL-Ansichten
  5. Top 6 Abfragebeispiele für Inner Join in Oracle