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
Kundennummer | Kundenname | Stadt | Land |
1 | Anja Damian | Berlin | Deutschland |
2 | Denny Cockett | Mexiko df | Mexiko |
3 | Eleanor Calnan | Mexiko df | Mexiko |
4 | Albertha Albury | London | Vereinigtes Königreich |
5 | Latisha Nembhard | Luleå | Schweden |
6 | Madalene Bing | Mannheim | Deutschland |
7 | Rebecka Beegle | Straßburg | Frankreich |
8 | Rosiger Tippie | Madrid | Spanien |
9 | Audie Khan | Marseille | Frankreich |
10 | Hildegard Burrowes | Tsawassen | Kanada |
11 | Cordell Dutremble | London | Vereinigtes Königreich |
12 | Nora Reyna | Buenos Aires | Argentinien |
13 | Ursula Laforest | Mexiko df | Mexiko |
14 | Claudie Neel | Bern | Schweiz |
15 | Portia Yee | São Paulo | Brasilien |
16 | Angila Segarra | London | Vereinigtes Königreich |
17 | Lise Wexler | Aachen | Deutschland |
18 | Ned Mendivil | Nantes | Frankreich |
19 | Sara Vidaurri | London | Vereinigtes Königreich |
20 | Tayna Navin | Graz | Österreich |
21 | Pura Ray | São Paulo | Brasilien |
22 | Erika Byard | Madrid | Spanien |
23 | Jimmie Luke | Lille | Frankreich |
24 | Shayla Byington | Bräcke | Schweden |
25 | Christiana Boden | München | Deutschland |
26 | Irina Nitta | Nantes | Frankreich |
27 | Bryanna Alls | Turin | Italien |
28 | Norah Picken | Lisboa | Portugal |
29 | Moriah Stwart | Barcelona | Spanien |
30 | Idella Harriott | Sevilla | Spanien |
Auftragsnummer | Kundennummer | Bestelldatum |
10254 | 14 | 11-07-1996 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | 7 | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 | 12-08-1996 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 04.09.1996 |
10303 | 30 | 11.09.1996 |
10308 | 2 | 18.09.1996 |
10311 | 18 | 20.09.1996 |
10326 | 8 | 10-10-1996 |
10327 | 24 | 11-10-1996 |
10328 | 28 | 14-10-1996 |
10331 | 9 | 16-10-1996 |
10337 | 25 | 24.10.1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 06-11-1996 |
10351 | 20 | 11-11-1996 |
10352 | 28 | 12-11-1996 |
10355 | 4 | 15-11-1996 |
10360 | 7 | 22-11-1996 |
10362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 03-12-1996 |
10378 | 24 | 10-12-1996 |
10382 | 20 | 13-12-1996 |
10383 | 4 | 16-12-1996 |
10384 | 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | 10 | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 01-01-1997 |
10402 | 20 | 02-01-1997 |
10403 | 20 | 03-01-1997 |
10408 | 23 | 08-01-1997 |
10410 | 10 | 10-01-1997 |
10411 | 10 | 10-01-1997 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | 10 | 30-01-1997 |
10434 | 24 | 03-02-1997 |
10435 | 16 | 04-02-1997 |
10436 | 7 | 05-02-1997 |
10442 | 20 | 11-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:
Land | Anzahl der Bestellungen |
Österreich | 10 |
Frankreich | 9 |
Schweden | 7 |
Deutschland | 6 |
Vereinigtes Königreich | 6 |
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 -
- SQL-Einfügeabfrage
- Fremdschlüssel in SQL
- Eindeutiges Schlüsselwort in SQL
- SQL-Ansichten
- Top 6 Abfragebeispiele für Inner Join in Oracle