Zurück zur Artikelliste Artikel
9 Leseminuten

Wie man eine WHERE-Klausel in SQL schreibt

Wir erklären die Verwendung der SQL WHERE-Klausel anhand von praktischen Beispielen. Wenn Sie gerade erst angefangen haben, SQL zu lernen und wissen wollen, wie Sie nur einen bestimmten Teil der in Ihren Tabellen gespeicherten Daten abrufen oder bearbeiten können, dann ist dieser Artikel genau das Richtige für Sie!

Die SQL-Klausel WHERE müssen Sie beherrschen, wenn Sie SQL für die Arbeit mit Daten nutzen wollen. Sie ist wohl eines der grundlegendsten Konstrukte von SQL, das man lernen muss.

Meiner Erfahrung nach gibt es kaum eine Abfrage zum Abruf oder zur Bearbeitung von Daten, die keine WHERE Klausel verwendet. Das Filtern der Details der Angestellten, die zu einer bestimmten Abteilung gehören, das Auswählen der Bestellungen mit Werten über einem bestimmten Betrag oder das Abrufen einer Liste von Kunden, die zu einer bestimmten geografischen Region gehören, erfordern alle, dass Sie die WHERE Klausel auf die eine oder andere Weise in Ihren Abfragen verwenden.

Frage: Was ist SQL Where?

Die SQL-Klausel WHERE filtert Datensätze auf der Grundlage bestimmter Bedingungen; sie ermöglicht es Ihnen, Daten in einer Datenbank selektiv abzurufen, zu ändern oder zu löschen. Sie ist wichtig, um in den Operationen SELECT, UPDATE oder DELETE genaue Zeilen anzusteuern.

Dies sind natürlich nur einige Beispiele. Im Allgemeinen können Sie die SQL-Klausel WHERE verwenden, um beliebige Zeilen aus Ihren Tabellen zu filtern.

Fangen wir also ohne Umschweife direkt an!

Grundlegende Syntax einer SQL-Abfrage mit einer WHERE-Klausel

Die grundlegende Syntax einer SQL-Abfrage, die eine WHERE -Klausel verwendet, lautet wie folgt:

SELECT <column names>
FROM <table name>
WHERE <conditions>;

Die WHERE -Klausel folgt auf die SELECT - und die FROM -Klausel. Während die SELECT -Klausel die Spalten angibt, die aus der/den Tabelle(n) zurückgegeben werden sollen, enthält die WHERE -Klausel die Bedingungen, die als wahr bewertet werden müssen, damit eine Zeile als Ergebnis zurückgegeben werden kann. Jede Bedingung wird für jede Zeile ausgewertet, die aus der/den Tabelle(n) zurückgegeben wird. SQL verfügt über eine Vielzahl von bedingten Operatoren, mit denen Sie angeben können, wie die benötigten Zeilen gefiltert werden sollen.

Um dies besser zu erklären, möchte ich Ihnen einige SQL WHERE Beispiele zeigen.

Die SQL WHERE-Klausel mit einer einzigen Bedingung

Stellen Sie sich vor, Sie arbeiten in einem multinationalen Unternehmen mit Niederlassungen rund um den Globus. Die Daten dieser Niederlassungen sind in einer Datenbank gespeichert, und zwar in einer Tabelle namens offices.

Die Tabelle offices Tabelle:

office_codecitystatecountrypostal_codeterritory
1San FranciscoCAUSA94080NA
2BostonMAUSA02107NA
3NYCNYUSA10022NA
4ParisNULLFrance75017EMEA
5TokyoChiyoda-KuJapanNULLJAPAC
6SydneyNULLAustraliaNSW-2010JAPAC
7LondonNULLUKEC2N 1HNEMEA

Angenommen, Sie möchten eine Liste der Niederlassungen in den USA. Ihre Abfrage sieht wie folgt aus:

SELECT *
FROM offices
WHERE country = 'USA';

Die Ausgabe:

office_codecitystatecountrypostal_codeterritory
1San FranciscoCAUSA94080NA
2BostonMAUSA02107NA
3NYCNYUSA10022NA

Bei dieser Abfrage wertet SQL zunächst jede Zeile aus und vergleicht den Wert der Spalte country mit 'USA'. Anschließend werden nur die Zeilen zurückgegeben, für die die Bedingung als wahr ausgewertet wird. In unserem Fall haben wir drei Zeilen, in denen das Land die USA ist.

(Wenn Sie zu diesem Zeitpunkt noch nicht wissen, wie man Abfragen schreibt, empfehle ich Ihnen, den SQL-Grundlagenkurs von LearnSQL.de. Er ist nicht nur gut strukturiert, sondern enthält auch einige tolle Übungen, die Sie beim Lernen und Wachsen unterstützen).

Sie können auch Vergleichsoperatoren wie >, <, >=, <= und <> verwenden, um Werte zu vergleichen. Nehmen wir an, Sie möchten nur die Zeilen abrufen, in denen office_code größer als 5 ist.

Die Abfrage:

SELECT *
FROM offices
WHERE office_code > 5;

Die Ausgabe:

office_codecitystatecountrypostal_codeterritory
6SydneyNULLAustraliaNSW-2010APAC
7LondonNULLUKEC2N 1HNEMEA

Oder, wenn Sie alle Zeilen abrufen wollen, in denen territory nicht 'NA' ist, sieht die Abfrage wie folgt aus:

SELECT *
FROM offices
WHERE territory <> 'NA';

Die Ausgabe:

office_codecitystatecountrypostal_codeterritory
4ParisNULLFrance75017EMEA
5TokyoChiyoda-KuJapanNULLJAPAC
6SydneyNULLAustraliaNSW-2010JAPAC
7LondonNULLUKEC2N 1HNEMEA

Die SQL WHERE-Klausel mit mehreren Bedingungen

Bisher habe ich sehr einfache Beispiele für Abfragen behandelt, die die Verwendung einer SQL WHERE-Klausel mit einer einzigen Bedingung veranschaulichen. Wenn Sie jedoch praktische, reale Abfragen schreiben, verwenden Sie oft mehr als eine Bedingung, um die gewünschten Ergebnisse zu erhalten.

Verwendung von bedingten Operatoren

SQL verfügt über die bedingten Operatoren AND, OR und NOT, um die Anzahl der in einer Abfrage verwendeten Bedingungen zu erweitern. Mit dem Operator AND können Sie Bedingungen verknüpfen, wenn Sie nur die Zeilen erhalten möchten, die alle Bedingungen erfüllen. Im Gegensatz dazu verwenden Sie den Operator OR, wenn Sie alle Zeilen abrufen möchten, für die mindestens eine der Bedingungen erfüllt ist.

Angenommen, Sie möchten die Städte und Länder aller Büros in Großbritannien oder Frankreich abrufen. Wie Sie vielleicht schon erraten haben, verwenden Sie dazu den Operator OR.

Die Abfrage:

SELECT city, country
FROM offices
WHERE country = 'UK'
  OR country = 'France';

Die Ausgabe:

citycountry
ParisFrance
LondonUK

Hier gibt SQL die Zeilen zurück, für die eine oder beide Bedingungen erfüllt sind. In der Praxis gibt es eine bessere Möglichkeit, diese Abfrage mit dem IN-Operator zu schreiben.

Verwendung eines IN Operators

Mit dem IN Operator können Sie eine Liste von Werten angeben, gegen die geprüft werden soll. Siehe die folgende Abfrage:

SELECT city, country
FROM offices
WHERE country IN ('UK', 'France');

Die Ausgabe:

citycountry
ParisFrance
LondonUK

Hier werden alle Zeilen zurückgegeben, deren Länder in der Liste der angegebenen Werte enthalten sind (in unserem Fall das Vereinigte Königreich und Frankreich).

Mit dem Operator IN können Sie eine Liste mit vielen Werten angeben, nicht nur zwei.

Mit dem Operator NOT IN können Sie die Zeilen zurückgeben, deren Werte nicht in der Liste enthalten sind. So können Sie zum Beispiel die Postleitzahlen aller Büros abrufen, die nicht im Gebiet JAPAC oder EMEA liegen.

Verwendung des IN-Operators in einer Unterabfrage

Eine weitere Möglichkeit, den Operator IN zu verwenden, ist eine Unterabfrage, um eine Liste aus einer anderen Tabelle zu erstellen. Um dies besser zu verstehen, stellen Sie sich vor, Sie haben eine andere Tabelle, die die Einnahmen für jede Niederlassung enthält.

Die office_revenue Tabelle:

office_coderevenue
1100002
2232221
3545556
4543432
5765678
6433433
7123245

Sie möchten wissen, welche Niederlassungen nicht genügend Einnahmen erzielen, und Sie definieren dies als Niederlassungen mit Einnahmen von weniger als 200.000. Das bedeutet, dass Sie die Städte der Niederlassungen mit weniger als 200.000 Euro Umsatz finden müssen.

Die Abfrage:

SELECT city
FROM offices
WHERE office_code IN (SELECT office_code
  FROM  office_revenue
  WHERE revenue < 200000);

Die Ausgabe:

city
San Francisco
London

In dieser Abfrage verarbeitet SQL zunächst die Unterabfrage, um eine Liste der Bürocodes für die Büros mit einem Umsatz von weniger als 200.000 zurückzugeben. Die Bürocodes in der Tabelle offices werden dann mit dieser Liste verglichen, um die Zeilen zurückzugeben, die denjenigen in der Liste entsprechen.

Komplexere Bedingungen

Versuchen wir ein etwas komplexeres Beispiel.

Wie wäre es, wenn Sie die Bürocodes und die Städte aller Büros abrufen möchten, die im Gebiet JAPAC oder EMEA liegen, deren Postleitzahlen nicht NULL sind, für die kein Bundesland angegeben ist und deren Bürocodes größer oder gleich 5 sind?

Ein guter Ansatz zum Schreiben dieser Abfrage besteht darin, die Bedingungen einzeln zu isolieren und jede mit den verfügbaren Spalten zu verknüpfen:

  • Die territory ist entweder JAPAC oder EMEA.
  • Die postal_code ist nicht NULL.
  • Der Status ist NULL oder leer.
  • office_code ist größer als oder gleich 5.

Da Sie nun die Bedingungen verstehen, wird das Schreiben der Abfrage zum Kinderspiel. Beachten Sie, dass alle diese Bedingungen erfüllt sein müssen, damit eine Zeile zurückgegeben wird.

Die Abfrage:

SELECT office_code, city
FROM offices
WHERE territory IN ('JAPAC', 'EMEA')
AND postal_code IS NOT NULL
AND (state IS NULL OR state = '')
AND office_code >= 5;

Die Ausgabe:

office_codecity
6Sydney
7London

Die Bedingungen werden auf die folgende Weise ausgewertet. Mit der ersten Bedingung gibt SQL nur die Zeilen zurück, deren Territorium JAPAC oder EMEA ist. Von diesen Zeilen wird dann geprüft, ob die Postleitzahl NULL lautet. Dann wird die dritte Bedingung berücksichtigt, bei der wir die Klammern verwenden. Die beiden Bedingungen in den Klammern werden ausgewertet, um ein gemeinsames Ergebnis zu erhalten: Es wird der Wert der Spalte state geprüft und wahr zurückgegeben, wenn er entweder leer oder NULL ist. Schließlich filtert die letzte Bedingung die Zeilen mit office_code größer oder gleich 5. Daher werden nur die Büros in Sydney und London in das Ergebnis aufgenommen.

Beachten Sie, dass wir postal_code <> NULL or state = NULL nicht verwenden. Stattdessen haben wir die Operatoren IS NOT und IS verwendet, um Werte mit NULL herauszufiltern . Der Grund dafür ist, dass NULL etwas ist, das unbekannt ist oder nicht existiert und daher niemals mit einem anderen Wert gleichgesetzt werden kann. SQL wirft keinen Fehler aus, wenn Sie = oder <> verwenden, aber stattdessen erhalten Sie eine leere Menge als Ergebnis und es werden keine Zeilen zurückgegeben. Das ist offensichtlich falsch.

Nehmen wir an, Sie haben dieselbe Anforderung, nur dass Sie jetzt alle Bürocodes erhalten möchten, die größer als oder gleich 4, aber kleiner als oder gleich 6 sind. Hierfür können Sie den Operator BETWEEN verwenden.

Die Abfrage:

SELECT office_code, city
FROM offices
WHERE territory IN ('JAPAC', 'EMEA')
AND postal_code IS NOT NULL
AND (state is NULL OR state ='')
AND office_code BETWEEN 4 AND 6;

Die Ausgabe:

office_codecity
4Paris
6Sydney

Der Operator BETWEEN sucht nach einem Bereich von Werten zwischen 4 und 6, einschließlich der Grenzen. Jetzt sehen Sie zwei zurückgegebene Zeilen: Paris und Sydney.

Was Sie nicht in einer WHERE-Klausel verwenden können

Sie können Aggregatfunktionen nicht direkt in einer WHERE Klausel verwenden. Das liegt daran, dass die Bedingungen in einer WHERE -Klausel zeilenweise ausgewertet werden, während Aggregatfunktionen mehrere Zeilen bearbeiten, um ein einziges Ergebnis zurückzugeben.

Betrachten Sie dieses Beispiel. Sie möchten alle Bürocodes zurückgeben, deren Umsatz über dem Durchschnitt liegt. Vielleicht ist Ihr erster Instinkt, etwas wie dieses zu schreiben:

SELECT office_code
FROM office_revenue
WHERE revenue > AVG(revenue);

Diese Abfrage gibt jedoch einen Fehler zurück:

ERROR 1111 (HY000): Invalid use of group function

Das Filtern von Datensätzen mit Aggregatfunktionen kann mit einer Unterabfrage erreicht werden. Schauen Sie sich das an:

SELECT office_code, revenue
FROM office_revenue
WHERE revenue > (SELECT AVG(revenue)
		     FROM office_revenue);

Die Ausgabe:

office_coderevenue
3545556
4543432
5765678
6433433

In dieser Abfrage ruft SQL zunächst den durchschnittlichen Umsatz aus der Unterabfrage ab. Dann vergleicht es diesen Wert mit dem Umsatz für jede Zeile und gibt nur die Bürocodes zurück, deren Umsatz über dem Durchschnittswert liegt.

Sind Sie bereit, die SQL WHERE-Klausel in Ihren Abfragen zu verwenden?

Nachdem Sie diesen Artikel gelesen haben, wissen Sie nun, wie Sie die SQL-Klausel WHERE verwenden können. Die Abfragen in diesem Artikel sind grundlegend und eignen sich gut für einen Anfänger.

Wenn Sie vor kurzem mit dem Erlernen von SQL begonnen haben und Ihr Wachstum beschleunigen möchten, empfehle ich Ihnen diesen Titel von LearnSQL.de. Ich bevorzuge diesen, weil er für einen SQL-Neuling so umfassend ist.

Er bildet eine hervorragende Grundlage für einen Analysten - oder für jeden, der SQL verwendet - und bietet eine gute Basis für das Schreiben von Abfragen, die Sie tagtäglich verwenden, um Erkenntnisse aus Daten zu gewinnen.

Was ich jedoch nicht genug betonen kann, ist die Notwendigkeit von praktischer Übung und Konsistenz. Das zementiert das Gelernte. Sie können damit beginnen, jeden Tag 10-20 Abfragen zu schreiben, um zu üben; innerhalb von 3 Monaten werden Sie fast 1.800 Abfragen geschrieben haben!

Das Tolle an SQL ist, dass es so einfach und gleichzeitig so leistungsstark ist. Also, worauf warten Sie noch? Machen Sie sich sofort die Hände schmutzig!!