Entdecke, wie WHERE Daten auf Zeilenebene in SQL-Abfragen filtert, während HAVING gruppierte Daten nach der Aggregation filtert, und beherrsche ihre unterschiedlichen Verwendungen in SQL-Abfragen.
WHERE und HAVING sind zwei wichtige Klauseln in SQL. Egal, ob du sehr fortgeschrittene oder sehr einfache Abfragen schreibst, du wirst beides verwenden müssen. Du kannst dir WHERE und HAVING wie Geschwister vorstellen. Sie haben beide eine ähnliche Funktion (Filtern) und treten oft zusammen auf. Aber genau wie Geschwister haben sie unterschiedliche Eigenschaften und einzigartige Rollen.
Wenn du gerade dabei bist, WHERE und HAVING zu sortieren, empfehle ich dir, dich für unseren Lernpfad zu den SQL-Grundlagen anzumelden, der ein guter und umfassender Ausgangspunkt ist. Du lernst etwas über die verschiedenen SQL-Klauseln, die Ausführungsreihenfolge von SQL, die Optimierung von SQL-Abfragen und viele andere wichtige Dinge.
Die kurze Antwort: WO gegen. HABEN
Die kurze Antwort und die Quelle der Verwirrung für viele Leute ist, dass WHERE mit Daten auf Zeilenebene arbeitet, während HAVING mit gruppierten Daten arbeitet. Hier ist ein Leitfaden:
WHERE filtert Zeilen, bevor eine Gruppierung oder Aggregation stattfindet. Sie gilt für einzelne Zeilen und kann nicht mit Aggregatfunktionen verwendet werden.
HAVING filtert Gruppen, nachdem die Gruppierung und Aggregation durchgeführt wurde. Sie gilt für die Ergebnisse von Aggregatfunktionen und wird in Kombination mit GROUP BY verwendet.
Ein kurzes Beispiel, um den Unterschied zu verdeutlichen
Schauen wir uns ein kurzes Beispiel an. Wenn du deinen eigenen Arbeitsablauf nachvollziehen möchtest, kannst du den Datensatz für die Immobilienvermietung von diesem GitHub-Repository herunterladen.
Nehmen wir an, wir müssen alle Immobilien in unserem Datensatz zurückgeben, die einen Mietpreis von weniger als 500 US-Dollar haben. Die Detailstufe jeder Zeile im Datensatz (eine Eigenschaft pro Zeile) entspricht der Detailstufe der Abfragebedingung. Deshalb verwenden wir WHERE in der folgenden Abfrage:
Das Ergebnis würde wie folgt aussehen. Beachte, dass 118 Zeilen zurückgegeben werden.
Einfache Zeilenfilterung mit WHERE. Bild vom Autor.
Nehmen wir nun an, wir wollen keine Tabelle mit Immobilien, sondern mit Städten, in denen der durchschnittliche Mietpreis unter 2.700 $ liegt. Anstatt jede Zeile einer Immobilie zuzuordnen, werden wir die Zeilen gruppieren und den Mietpreis zu einem durchschnittlichen Mietpreis für jede Stadt zusammenfassen. Deshalb verwenden wir HAVING, wie in dieser Abfrage:
SELECT city,AVG(rental_price)AS average_rent
FROM rentals
GROUPBY city
HAVINGAVG(rental_price)<2700;Bereitgestellt von
Und das Ergebnis wäre. Beachte, dass es nur ein Ergebnis gibt.
Einfache Gruppenfilterung mit HAVING. Bild vom Autor.
WHERE, HAVING und die Reihenfolge der SQL-Ausführung
Wir sehen, dass WHERE mit Filtern auf Zeilenebene arbeitet, während HAVING mit Filtern auf Aggregatebene arbeitet. Wenn wir diesen Unterschied verstehen, können wir auch etwas über die Reihenfolge der Ausführung von SQL-Klauseln lernen.
WHERE wird vor GROUP BY und direkt nach FROM (und JOIN, falls vorhanden) ausgewertet; es kann keine Gruppierung oder Aggregation vornehmen. WHERE kommt ins Spiel, bevor eine Aggregation vorgenommen wird. Deshalb arbeitet sie nur mit Daten auf Zeilenebene.
In der Zwischenzeit kommt HAVING nach der Ausführung der GROUP BY Klausel. Das bedeutet, dass sie ins Spiel kommt, nachdem die Tabelle transformiert und auf einer anderen Ebene gruppiert wurde als die Granularität der Ausgangstabelle. HAVING arbeitet mit der neuen, transformierten Version der Tabelle.
Wie man die WHERE-Klausel in SQL verwendet
Gehen wir einen Schritt zurück und schauen wir uns jede Klausel einzeln an. Wir können mit der WHERE Klausel beginnen.
WHERE-Syntax und Anweisungen
WHERE kann in drei verschiedenen SQL-Anweisungen verwendet werden: SELECT, UPDATE, und DELETE.
WHERE in SELECT-Anweisungen
In SELECT Anweisungen, die zum Abrufen von Daten aus der Datenbank verwendet werden, spielt WHERE eine direkte Rolle beim Filtern auf Zeilenebene und hat seinen bekannten Platz direkt nach der FROM Klausel, wie wir in der folgenden Abfrage sehen können:
SELECT column1, column2… etc.FROM table_name
WHERE condition;Bereitgestellt von
WHERE in Verbindung mit SELECT ist die Stelle, an der die Klausel WHERE am häufigsten mit HAVING verwechselt wird.
WHERE in UPDATE-Anweisungen
Darüber hinaus spielt WHERE eine wichtige Rolle in UPDATE Anweisungen, um die Zeile zu bestimmen, in der die Datenaktualisierung stattfinden soll, wie wir an der folgenden Syntax sehen können:
UPDATE table_name
SET column_name1 = value1, column_name2 = value2… etc.WHERE condition;Bereitgestellt von
WHERE in DELETE-Anweisungen
WHERE ist auch eine nützliche Ergänzung zu den DELETE Anweisungen, um die Datensätze (Zeilen) zu bestimmen, die gelöscht werden sollen, wie wir hier sehen können:
WHERE Bedingungen werden als einfacher logischer Ausdruck geschrieben. Sie besteht aus drei Teilen: der Variablen/dem Operanden, der Bedingung und dem Wert/Ergebnis. Werfen wir einen Blick auf die Optionen für die WHERE Bedingungen, die sowohl Vergleichs- als auch logische Operatoren enthalten.
Die Anweisung liefert alle Grundstücke, die weder in Kairo noch in Gizeh liegen.
Grundstücke außerhalb von Kairo und Gizeh. Bild vom Autor.
WO Anwendungsfälle
Da WHERE mit den Anweisungen SELECT, UPDATE und DELETE arbeitet, können wir vorhersehen, dass es für drei Anwendungsfälle verwendet werden kann: Filtern auf Zeilenebene, Abrufen von Daten und Datenmanipulation.
Filterung auf Zeilenebene
Wir können unsere Tabellenzeilen nach einer oder mehreren Bedingungen filtern. Die folgende Abfrage filtert die Zeilen so, dass nur Villen-Eigenschaften enthalten sind.
Auswählen von Villen-Eigenschaften. Bild vom Autor.
Datenabruf
WHERE kann verwendet werden, um einen bestimmten Datenpunkt abzurufen, nach dem wir suchen. Dies ist ähnlich wie das Filtern auf Zeilenebene, aber spezifischer. Angenommen, wir brauchen die ID der Immobilie, die am ersten Januar 2022 in Kairo verfügbar war, dann können wir die folgende Abfrage verwenden:
SELECT property_id
FROM rentals
WHERE available_date ='2022-01-01'AND city ='Cairo';Bereitgestellt von
Abrufen eines Datenpunktes. Bild vom Autor.
Datenbearbeitung
Schließlich ist WHERE ein großartiges Hilfsmittel, um Werte zu ändern und bestimmte Datensätze in deiner Datenbank zu löschen. Wenn wir zum Beispiel herausgefunden haben, dass das Grundstück 171 nicht haustierfreundlich ist, können wir die Spalte pet_friendly mit WHERE in einer UPDATE Anweisung wie folgt ändern:
UPDATE rentals
SET pet_friendly =falseWHERE property_id =171;Bereitgestellt von
Wie man die HAVING-Klausel in SQL verwendet
Jetzt ist es an der Zeit, sich der HAVING Klausel in der gleichen Ausführlichkeit zuzuwenden.
HAVING-Syntax und Anweisungen
Zunächst einmal sollten wir wissen, dass die HAVING Klausel nur in SELECT Anweisungen verwendet werden kann. Die einzige Syntax, die sie haben kann, ist daher die folgende:
SELECT grouped_column, aggregate_function(aggregated_column)… etc.FROM table_name
GROUPBY grouped_column
HAVING conditionBereitgestellt von
Beachte, dass du mehr als eine gruppierte Spalte und mehr als eine aggregierte Spalte hinzufügen kannst. Im Folgenden werden wir Beispiele sehen.
Wie man HAVING-Bedingungen schreibt
Wie WHERE werden auch HAVING Bedingungen als logische Ausdrücke geschrieben, allerdings mit einer zusätzlichen Komponente, der Aggregationsfunktion. Eine HAVING Bedingung besteht also aus 1) Aggregatfunktion, 2) Variable/Operand, 3) Vergleichsoperator und 4) Wert/Ergebnis.
Aggregatfunktionen mit HAVING
SQL hat hauptsächlich fünf Aggregatfunktionen und eine sechste, die ein Sonderfall ist. Diese Funktionen sind:
Aggregatfunktion
Geeigneter Datentyp
SUM()
Numerisch
AVG()
Numerisch
MIN()
Numerisch, Text, Datum/Zeitstempel
MAX()
Numerisch, Text, Datum/Zeitstempel
COUNT()
Numerisch, Text, Datum/Zeitstempel, Boolesch
Lass uns ein Beispiel ausprobieren. Hier verwenden wir die Funktion COUNT() mit GROUP BY, um eine Häufigkeitstabelle zu erstellen, und verwenden die Bedingung HAVING als Filter. Konkret müssen wir die Städte kennen, die 150 Mal oder weniger erwähnt werden, was in diesem Zusammenhang mit der Anzahl der Anmeldungen zu tun hat. Wir können diese Abfrage verwenden:
SELECT city,COUNT(*)AS properties_count
FROM rentals
GROUPBY city
HAVINGCOUNT(*)<=150;Bereitgestellt von
Verwendung von COUNT() mit HAVING. Bild vom Autor.
Vergleich und logische Operatoren
HAVING akzeptiert alle Vergleichs- und logischen Operatoren, die auch WHERE akzeptiert. Der einzige Unterschied besteht darin, dass der geeignete Datentyp bei HAVING in erster Linie von der Aggregatfunktion abhängt, wie wir in der Tabelle oben sehen können.
HAVING Anwendungsfälle
Im Gegensatz zu WHERE kann HAVING nicht in den Anweisungen UPDATE und DELETE verwendet werden; HAVING wird nur für die Datenabfrage verwendet. Grob gesagt ergeben sich daraus zwei Szenarien:
Filterung auf Gruppenebene
Dies ist die übliche und normale Verwendung von HAVING. Ein Beispiel dafür ist, nur Städte zurückzugeben, deren durchschnittliche Mietpreise unter 2.700 $ liegen.
SELECT city,AVG(rental_price)AS avg_price
FROM rentals
GROUPBY city
HAVINGAVG(rental_price)<2700;Bereitgestellt von
Einreihige Filterung
Dies ist ein ungewöhnlicher Fall, aber HAVING kann verwendet werden, um eine einzeilige Aggregation, wie eine Metrik oder einen KPI, nur dann zurückzugeben, wenn sie eine bestimmte Bedingung erfüllt. Dies kann durch die Nutzung von HAVING ohne GROUP BY erreicht werden. Im folgenden Beispiel geben wir den durchschnittlichen Mietpreis nur zurück, wenn er unter 2.800 $ liegt. Wenn die Maßnahme die Bedingung erfüllt, haben wir ein einzeiliges Ergebnis. Andernfalls hätten wir eine leere Tabelle.
SELECTAVG(rental_price)as avg_price
FROM rentals
HAVINGAVG(rental_price)>2800;Bereitgestellt von
WHERE und HAVING kombinieren
WHERE und HAVING können kombiniert werden, um Tabellen sowohl vor als auch nach der Aggregation zu filtern. Im folgenden Beispiel geben wir die Anzahl der Immobilien in jeder Stadt zurück, wobei wir nur Immobilien zählen, die haustierfreundlich sind, und nur Städte mit mehr als 80 Immobilien herausfiltern.
SELECT city,COUNT(*)AS number_properties
FROM rentals
WHERE pet_friendly =trueGROUPBY city
HAVINGCOUNT(*)>80;Bereitgestellt von
Einfache Kombination aus WHERE und HAVING. Bild vom Autor.
Der Unterschied zwischen WHERE und HAVING in der Leistung
Wir wissen, dass die WHERE Klausel vor der Gruppierung oder Aggregation angewendet wird. Aber wir sollten auch wissen, dass WHERE aus diesem Grund effizienter für das Filtern einzelner Zeilen ist, weil es die Anzahl der verarbeiteten Zeilen zu Beginn der Abfrage reduziert.
Auf der anderen Seite wissen wir, dass die HAVING Klausel nach der Aggregation angewendet wird und die Ergebnismenge auf Basis der gruppierten Daten filtert. Aus diesem Grund ist sie, da sie Daten verarbeitet, nachdem alle Zeilen gruppiert wurden, in der Regel weniger effizient als WHERE, obwohl sie für Bedingungen mit Aggregatfunktionen immer noch notwendig ist.
Schauen wir uns diese Abfrage an:
SELECT city,COUNT(*)FROM rentals
GROUPBY city
HAVING rental_price <2700;Bereitgestellt von
Diese Abfrage ist ineffizient, weil die rental_price Bedingung nicht von einer Aggregation abhängt - sie filtert einzelne Zeilen. Diese Abfrage gruppiert zunächst alle Mieten nach Städten, zählt sie und filtert dann das Ergebnis, was ineffizient ist, weil es unnötige Zeilen verarbeitet. Aus diesem Grund wäre dies eine schnellere Abfrage gewesen:
SELECT city,COUNT(*)FROM rentals
WHERE rental_price <2700GROUPBY city;Bereitgestellt von
WHERE und HAVING Optimierungstipps
Anhand der vorangegangenen Ausführungen können wir einige bewährte Praktiken erkennen, mit denen wir die Verwendung der Klauseln WHERE und HAVING optimieren können. Das ist wichtig, wenn du große Datensätze hast.
Sei sehr wählerisch: Filtere nach den Werten, nach denen du filtern musst, und nicht nach mehr. Das hilft, die Anzahl der Zeilen in der Ansicht zu reduzieren und damit die Effizienz der Abfrage zu erhöhen.
Sei einfach: Entferne alle unnötigen Bedingungen, Aggregationen und Typenwürfe. All diese Extras haben definitiv einen rechnerischen Preis.
Früh filtern: Wenn du eine Aggregation auf Gruppenebene durchführst, filtere die Zeilen mit WHERE vor, um den Gruppierungsprozess zu beschleunigen. Auf diese Weise reduzierst du die Anzahl der Zeilen, die in der Gruppierung verarbeitet werden müssen.
Tabelle zum Vergleich
Fassen wir unsere Gedanken in einer praktischen Tabelle zusammen:
Vergleich
WO
HAVING
Hauptzweck
Filterung auf Zeilenebene
Filterung auf Gruppenebene
Grundlegende Syntax
SELECT Spalte1, Spalte2... FROM tabelle_name WHERE bedingung;
SELECT grouped_column, aggregate_function(aggregated_column)... FROM tabellenname GROUP BY grouped_column HAVING condition;
Bewertungsauftrag
Vor GROUP BY
Nach GROUP BY
Kompatible Aussagen
AUSWÄHLEN, AKTUALISIEREN, LÖSCHEN
SELECT
Bedingungen
Kann keine Aggregatfunktionen enthalten
Muss Aggregatfunktionen enthalten
Anwendungsfälle
Filtern auf Zeilenebene Abrufen von Daten Datenbearbeitung
Filterung auf Gruppenebene Einzelzeilenfilterung
Unterabfragen
Kann mit Unterabfragen arbeiten
Müssen als CTEs geschrieben werden
Fazit
Im Laufe des Artikels haben wir den Hauptunterschied zwischen WHERE und HAVING in SQL untersucht, nämlich dass die WHERE Klausel Zeilen vor der Aggregation filtert, während die HAVING Klausel gruppierte Daten nach der Aggregation filtert. Wir haben auch einige weniger bekannte Unterschiede untersucht, wie z.B. die Tatsache, dass WHERE mit SELECT, UPDATE und DELETE Anweisungen funktionieren kann, HAVING aber nur mit SELECT. Wir haben auch ein bisschen über Leistung gesprochen.
Das SQL Basics Cheat Sheet von DataCamp bietet eine gute Übersicht über die Klauseln WHERE und HAVING sowie eine Anleitung, wie man in SQL filtert. Wenn du mit SQL anfängst, solltest du dir auch den Lernpfad SQL Grundlagen und den Lernpfad Associate Data Analyst in SQL ansehen.
Autor
Islam Salahuddin
Islam ist Datenanalyst, Moderator am KPI Institute und Dozent an der Universität Kairo. Mit einem journalistischen Hintergrund hat Islam vielfältige Interessen, darunter Schreiben, Philosophie, Medien, Technologie und Kultur.
Häufig gestellte Fragen
Was ist der Unterschied zwischen WHERE und HAVING?⌄
WHERE filtert auf Zeilenebene, während HAVING auf Gruppenebene filtert.
Kann ich WHERE und HAVING in einer Abfrage kombinieren?⌄
Ja, und es wird dringend empfohlen, WHERE zu benutzen, wenn du HAVING verwenden willst.
Kann WHERE mit Aggregatfunktionen wie HAVING funktionieren?⌄
Nein, nur HAVING kann mit Aggregatfunktionen arbeiten.
Arbeiten WHERE und HAVING mit denselben Vergleichs- und logischen Operatoren?⌄
Ja, sie arbeiten beide mit denselben Operatoren, da WHERE und HAVING Bedingungen als logische Ausdrücke geschrieben werden.
Kann ich HAVING ohne GROUP BY verwenden?⌄
HAVING wird in der Regel nach der Gruppierung mit GROUP BY verwendet. Die einzige Ausnahme ist das Filtern von Ein-Wert-Ansichten (z. B. die Berechnung einer Kennzahl).
Gewinne Vertrauen in die OLS-Regression, indem du ihre theoretischen Grundlagen beherrschst. Erforsche, wie du einfache Implementierungen in Excel, R und Python durchführst.
Lerne, wie du Python-Listen mit Techniken wie Slicing, List Comprehensions und itertools aufteilen kannst. Finde heraus, wann du welche Methode für die beste Datenverarbeitung nutzen solltest.
Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
WHEREundHAVINGsind zwei wichtige Klauseln in SQL. Egal, ob du sehr fortgeschrittene oder sehr einfache Abfragen schreibst, du wirst beides verwenden müssen. Du kannst dirWHEREundHAVINGwie Geschwister vorstellen. Sie haben beide eine ähnliche Funktion (Filtern) und treten oft zusammen auf. Aber genau wie Geschwister haben sie unterschiedliche Eigenschaften und einzigartige Rollen.Wenn du gerade dabei bist,
WHEREundHAVINGzu sortieren, empfehle ich dir, dich für unseren Lernpfad zu den SQL-Grundlagen anzumelden, der ein guter und umfassender Ausgangspunkt ist. Du lernst etwas über die verschiedenen SQL-Klauseln, die Ausführungsreihenfolge von SQL, die Optimierung von SQL-Abfragen und viele andere wichtige Dinge.Die kurze Antwort: WO gegen. HABEN
Die kurze Antwort und die Quelle der Verwirrung für viele Leute ist, dass
WHEREmit Daten auf Zeilenebene arbeitet, währendHAVINGmit gruppierten Daten arbeitet. Hier ist ein Leitfaden:WHEREfiltert Zeilen, bevor eine Gruppierung oder Aggregation stattfindet. Sie gilt für einzelne Zeilen und kann nicht mit Aggregatfunktionen verwendet werden.HAVINGfiltert Gruppen, nachdem die Gruppierung und Aggregation durchgeführt wurde. Sie gilt für die Ergebnisse von Aggregatfunktionen und wird in Kombination mitGROUP BYverwendet.Ein kurzes Beispiel, um den Unterschied zu verdeutlichen
Schauen wir uns ein kurzes Beispiel an. Wenn du deinen eigenen Arbeitsablauf nachvollziehen möchtest, kannst du den Datensatz für die Immobilienvermietung von diesem GitHub-Repository herunterladen.
Nehmen wir an, wir müssen alle Immobilien in unserem Datensatz zurückgeben, die einen Mietpreis von weniger als 500 US-Dollar haben. Die Detailstufe jeder Zeile im Datensatz (eine Eigenschaft pro Zeile) entspricht der Detailstufe der Abfragebedingung. Deshalb verwenden wir
WHEREin der folgenden Abfrage:Das Ergebnis würde wie folgt aussehen. Beachte, dass 118 Zeilen zurückgegeben werden.
Einfache Zeilenfilterung mit WHERE. Bild vom Autor.
Nehmen wir nun an, wir wollen keine Tabelle mit Immobilien, sondern mit Städten, in denen der durchschnittliche Mietpreis unter 2.700 $ liegt. Anstatt jede Zeile einer Immobilie zuzuordnen, werden wir die Zeilen gruppieren und den Mietpreis zu einem durchschnittlichen Mietpreis für jede Stadt zusammenfassen. Deshalb verwenden wir
HAVING, wie in dieser Abfrage:Und das Ergebnis wäre. Beachte, dass es nur ein Ergebnis gibt.
Einfache Gruppenfilterung mit HAVING. Bild vom Autor.
WHERE, HAVING und die Reihenfolge der SQL-Ausführung
Wir sehen, dass
WHEREmit Filtern auf Zeilenebene arbeitet, währendHAVINGmit Filtern auf Aggregatebene arbeitet. Wenn wir diesen Unterschied verstehen, können wir auch etwas über die Reihenfolge der Ausführung von SQL-Klauseln lernen.WHEREwird vorGROUP BYund direkt nachFROM(undJOIN, falls vorhanden) ausgewertet; es kann keine Gruppierung oder Aggregation vornehmen.WHEREkommt ins Spiel, bevor eine Aggregation vorgenommen wird. Deshalb arbeitet sie nur mit Daten auf Zeilenebene.In der Zwischenzeit kommt
HAVINGnach der Ausführung derGROUP BYKlausel. Das bedeutet, dass sie ins Spiel kommt, nachdem die Tabelle transformiert und auf einer anderen Ebene gruppiert wurde als die Granularität der Ausgangstabelle.HAVINGarbeitet mit der neuen, transformierten Version der Tabelle.Wie man die WHERE-Klausel in SQL verwendet
Gehen wir einen Schritt zurück und schauen wir uns jede Klausel einzeln an. Wir können mit der
WHEREKlausel beginnen.WHERE-Syntax und Anweisungen
WHEREkann in drei verschiedenen SQL-Anweisungen verwendet werden:SELECT,UPDATE, undDELETE.WHERE in SELECT-Anweisungen
In
SELECTAnweisungen, die zum Abrufen von Daten aus der Datenbank verwendet werden, spieltWHEREeine direkte Rolle beim Filtern auf Zeilenebene und hat seinen bekannten Platz direkt nach derFROMKlausel, wie wir in der folgenden Abfrage sehen können:WHEREin Verbindung mitSELECTist die Stelle, an der die KlauselWHEREam häufigsten mitHAVINGverwechselt wird.WHERE in UPDATE-Anweisungen
Darüber hinaus spielt
WHEREeine wichtige Rolle inUPDATEAnweisungen, um die Zeile zu bestimmen, in der die Datenaktualisierung stattfinden soll, wie wir an der folgenden Syntax sehen können:WHERE in DELETE-Anweisungen
WHEREist auch eine nützliche Ergänzung zu denDELETEAnweisungen, um die Datensätze (Zeilen) zu bestimmen, die gelöscht werden sollen, wie wir hier sehen können:Wie man WHERE-Bedingungen schreibt
WHEREBedingungen werden als einfacher logischer Ausdruck geschrieben. Sie besteht aus drei Teilen: der Variablen/dem Operanden, der Bedingung und dem Wert/Ergebnis. Werfen wir einen Blick auf die Optionen für dieWHEREBedingungen, die sowohl Vergleichs- als auch logische Operatoren enthalten.Hier ist ein Beispiel, in dem wir
NOTzusammen mit demINVergleichsoperator verwenden:Die Anweisung liefert alle Grundstücke, die weder in Kairo noch in Gizeh liegen.
Grundstücke außerhalb von Kairo und Gizeh. Bild vom Autor.
WO Anwendungsfälle
Da
WHEREmit den AnweisungenSELECT,UPDATEundDELETEarbeitet, können wir vorhersehen, dass es für drei Anwendungsfälle verwendet werden kann: Filtern auf Zeilenebene, Abrufen von Daten und Datenmanipulation.Filterung auf Zeilenebene
Wir können unsere Tabellenzeilen nach einer oder mehreren Bedingungen filtern. Die folgende Abfrage filtert die Zeilen so, dass nur Villen-Eigenschaften enthalten sind.
Auswählen von Villen-Eigenschaften. Bild vom Autor.
Datenabruf
WHEREkann verwendet werden, um einen bestimmten Datenpunkt abzurufen, nach dem wir suchen. Dies ist ähnlich wie das Filtern auf Zeilenebene, aber spezifischer. Angenommen, wir brauchen die ID der Immobilie, die am ersten Januar 2022 in Kairo verfügbar war, dann können wir die folgende Abfrage verwenden:Abrufen eines Datenpunktes. Bild vom Autor.
Datenbearbeitung
Schließlich ist
WHEREein großartiges Hilfsmittel, um Werte zu ändern und bestimmte Datensätze in deiner Datenbank zu löschen. Wenn wir zum Beispiel herausgefunden haben, dass das Grundstück 171 nicht haustierfreundlich ist, können wir die Spaltepet_friendlymitWHEREin einerUPDATEAnweisung wie folgt ändern:Wie man die HAVING-Klausel in SQL verwendet
Jetzt ist es an der Zeit, sich der
HAVINGKlausel in der gleichen Ausführlichkeit zuzuwenden.HAVING-Syntax und Anweisungen
Zunächst einmal sollten wir wissen, dass die
HAVINGKlausel nur inSELECTAnweisungen verwendet werden kann. Die einzige Syntax, die sie haben kann, ist daher die folgende:Beachte, dass du mehr als eine gruppierte Spalte und mehr als eine aggregierte Spalte hinzufügen kannst. Im Folgenden werden wir Beispiele sehen.
Wie man HAVING-Bedingungen schreibt
Wie
WHEREwerden auchHAVINGBedingungen als logische Ausdrücke geschrieben, allerdings mit einer zusätzlichen Komponente, der Aggregationsfunktion. EineHAVINGBedingung besteht also aus 1) Aggregatfunktion, 2) Variable/Operand, 3) Vergleichsoperator und 4) Wert/Ergebnis.Aggregatfunktionen mit HAVING
SQL hat hauptsächlich fünf Aggregatfunktionen und eine sechste, die ein Sonderfall ist. Diese Funktionen sind:
Lass uns ein Beispiel ausprobieren. Hier verwenden wir die Funktion
COUNT()mitGROUP BY, um eine Häufigkeitstabelle zu erstellen, und verwenden die BedingungHAVINGals Filter. Konkret müssen wir die Städte kennen, die 150 Mal oder weniger erwähnt werden, was in diesem Zusammenhang mit der Anzahl der Anmeldungen zu tun hat. Wir können diese Abfrage verwenden:Verwendung von COUNT() mit HAVING. Bild vom Autor.
Vergleich und logische Operatoren
HAVINGakzeptiert alle Vergleichs- und logischen Operatoren, die auchWHEREakzeptiert. Der einzige Unterschied besteht darin, dass der geeignete Datentyp beiHAVINGin erster Linie von der Aggregatfunktion abhängt, wie wir in der Tabelle oben sehen können.HAVING Anwendungsfälle
Im Gegensatz zu
WHEREkannHAVINGnicht in den AnweisungenUPDATEundDELETEverwendet werden;HAVINGwird nur für die Datenabfrage verwendet. Grob gesagt ergeben sich daraus zwei Szenarien:Filterung auf Gruppenebene
Dies ist die übliche und normale Verwendung von
HAVING. Ein Beispiel dafür ist, nur Städte zurückzugeben, deren durchschnittliche Mietpreise unter 2.700 $ liegen.Einreihige Filterung
Dies ist ein ungewöhnlicher Fall, aber
HAVINGkann verwendet werden, um eine einzeilige Aggregation, wie eine Metrik oder einen KPI, nur dann zurückzugeben, wenn sie eine bestimmte Bedingung erfüllt. Dies kann durch die Nutzung vonHAVINGohneGROUP BYerreicht werden. Im folgenden Beispiel geben wir den durchschnittlichen Mietpreis nur zurück, wenn er unter 2.800 $ liegt. Wenn die Maßnahme die Bedingung erfüllt, haben wir ein einzeiliges Ergebnis. Andernfalls hätten wir eine leere Tabelle.WHERE und HAVING kombinieren
WHEREundHAVINGkönnen kombiniert werden, um Tabellen sowohl vor als auch nach der Aggregation zu filtern. Im folgenden Beispiel geben wir die Anzahl der Immobilien in jeder Stadt zurück, wobei wir nur Immobilien zählen, die haustierfreundlich sind, und nur Städte mit mehr als 80 Immobilien herausfiltern.Einfache Kombination aus WHERE und HAVING. Bild vom Autor.
Der Unterschied zwischen WHERE und HAVING in der Leistung
Diese Abfrage ist ineffizient, weil die
rental_priceBedingung nicht von einer Aggregation abhängt - sie filtert einzelne Zeilen. Diese Abfrage gruppiert zunächst alle Mieten nach Städten, zählt sie und filtert dann das Ergebnis, was ineffizient ist, weil es unnötige Zeilen verarbeitet. Aus diesem Grund wäre dies eine schnellere Abfrage gewesen:WHERE und HAVING Optimierungstipps
Anhand der vorangegangenen Ausführungen können wir einige bewährte Praktiken erkennen, mit denen wir die Verwendung der Klauseln
WHEREundHAVINGoptimieren können. Das ist wichtig, wenn du große Datensätze hast.Sei sehr wählerisch: Filtere nach den Werten, nach denen du filtern musst, und nicht nach mehr. Das hilft, die Anzahl der Zeilen in der Ansicht zu reduzieren und damit die Effizienz der Abfrage zu erhöhen.
Sei einfach: Entferne alle unnötigen Bedingungen, Aggregationen und Typenwürfe. All diese Extras haben definitiv einen rechnerischen Preis.
Früh filtern: Wenn du eine Aggregation auf Gruppenebene durchführst, filtere die Zeilen mit
WHEREvor, um den Gruppierungsprozess zu beschleunigen. Auf diese Weise reduzierst du die Anzahl der Zeilen, die in der Gruppierung verarbeitet werden müssen.Tabelle zum Vergleich
Fassen wir unsere Gedanken in einer praktischen Tabelle zusammen:
Fazit
Im Laufe des Artikels haben wir den Hauptunterschied zwischen
WHEREundHAVINGin SQL untersucht, nämlich dass dieWHEREKlausel Zeilen vor der Aggregation filtert, während dieHAVINGKlausel gruppierte Daten nach der Aggregation filtert. Wir haben auch einige weniger bekannte Unterschiede untersucht, wie z.B. die Tatsache, dassWHEREmitSELECT,UPDATEundDELETEAnweisungen funktionieren kann,HAVINGaber nur mitSELECT. Wir haben auch ein bisschen über Leistung gesprochen.Das SQL Basics Cheat Sheet von DataCamp bietet eine gute Übersicht über die Klauseln
WHEREundHAVINGsowie eine Anleitung, wie man in SQL filtert. Wenn du mit SQL anfängst, solltest du dir auch den Lernpfad SQL Grundlagen und den Lernpfad Associate Data Analyst in SQL ansehen.