Bedingungen verknüpfen
AND behält Zeilen, bei denen beide Seiten wahr sind, OR solche, bei denen eine davon wahr ist. Ausgeschrieben fragt das nach Bestellungen, die bezahlt oder versandt sind und mehr als 500 wert.
1
SELECT order_number, status, total
FROM orders
WHERE (status = 'paid' OR status = 'shipped')
AND total > 500
ORDER BY total DESC
LIMIT 20;
Ergebnis — erste 5 von 20 Zeilen
| order_number | status | total |
|---|---|---|
| ORD-2025-002767 | shipped | 30906.66 |
| ORD-2022-001901 | shipped | 28151.01 |
| ORD-2023-001772 | paid | 26797.87 |
| ORD-2024-001907 | shipped | 26648.91 |
| ORD-2025-002847 | paid | 25837.57 |
Öffnet Planche in einem eigenen Browser-Tab, mit geladener Beispieldatenbank und dieser Abfrage im Editor. Alle Beispiele der Seite verwenden denselben Tab weiter, und ausgeführt wird erst, wenn Sie F9 drücken.
Die Klammern leisten echte Arbeit. Führen Sie dieselben Wörter ohne sie aus:
2
-- The same words without the brackets. AND binds tighter than OR,
-- so this reads as: paid (any total) OR shipped-and-over-500.
SELECT order_number, status, total
FROM orders
WHERE status = 'paid' OR status = 'shipped' AND total > 500
ORDER BY total DESC
LIMIT 20;
Ergebnis — erste 5 von 20 Zeilen
| order_number | status | total |
|---|---|---|
| ORD-2025-002767 | shipped | 30906.66 |
| ORD-2022-001901 | shipped | 28151.01 |
| ORD-2023-001772 | paid | 26797.87 |
| ORD-2024-001907 | shipped | 26648.91 |
| ORD-2025-002847 | paid | 25837.57 |
Sie bekommen eine andere Antwort, weil AND stärker bindet als OR – genau wie × stärker bindet als +. Ohne Klammern liest die Datenbank das als "bezahlt, in beliebiger Höhe, oder versandt und über 500", also kommt auch jede kleine bezahlte Bestellung zurück.
Einen von mehreren Werten treffen
Für eine Kette von ORs auf derselben Spalte gibt es IN.
3
SELECT order_number, status, total, ordered_at
FROM orders
WHERE status IN ('paid', 'shipped', 'delivered')
ORDER BY ordered_at DESC
LIMIT 20;
Ergebnis — erste 5 von 20 Zeilen
| order_number | status | total | ordered_at |
|---|---|---|---|
| ORD-2025-002480 | shipped | 6333.77 | 2025-12-28 23:52:14 |
| ORD-2025-000505 | delivered | 2276.51 | 2025-12-28 11:16:39 |
| ORD-2025-001581 | delivered | 2645.06 | 2025-12-28 06:12:38 |
| ORD-2025-000995 | delivered | 2584.02 | 2025-12-28 05:47:53 |
| ORD-2025-003219 | delivered | 561.48 | 2025-12-28 03:20:37 |
status IN ('paid', 'shipped', 'delivered') sagt, was drei ORs sagen würden, und sagt es einmal. NOT IN ist die Verneinung – mit einer scharfen Kante rund um NULL, die in der Lektion zu Unterabfragen einen eigenen Abschnitt bekommt.
Bereiche
BETWEEN a AND b ist die Kurzform für >= a AND <= b. Beide Enden sind eingeschlossen.
4
SELECT order_number, ordered_at, total
FROM orders
WHERE ordered_at BETWEEN '2025-01-01' AND '2025-01-31 23:59:59'
ORDER BY ordered_at
LIMIT 20;
Ergebnis — erste 5 von 20 Zeilen
| order_number | ordered_at | total |
|---|---|---|
| ORD-2025-003412 | 2025-01-01 00:18:52 | 2806.57 |
| ORD-2025-003616 | 2025-01-01 11:18:14 | 6955.62 |
| ORD-2025-001503 | 2025-01-01 23:43:34 | 5837.23 |
| ORD-2025-000317 | 2025-01-02 05:08:32 | 15130.7 |
| ORD-2025-001298 | 2025-01-02 18:36:32 | 5045.04 |
Muster
LIKE vergleicht mit einem Muster, in dem % für eine beliebige Folge von Zeichen steht und _ für genau eines.
5
SELECT first_name, last_name, email
FROM customers
WHERE email LIKE '%@inbox.example'
ORDER BY last_name
LIMIT 20;
Ergebnis — erste 5 von 20 Zeilen
| first_name | last_name | |
|---|---|---|
| Freya | Ahmed | freya.ahmed@inbox.example |
| Hugo | Ahmed | hugo.ahmed@inbox.example |
| Jonas | Ahmed | jonas.ahmed@inbox.example |
| Kenji | Ahmed | kenji.ahmed@inbox.example |
| Liam | Ahmed | liam.ahmed@inbox.example |
Fehlende Werte
279 dieser Kunden haben keine Telefonnummer hinterlegt. Hier sind sie:
6
SELECT id, first_name, last_name, phone
FROM customers
WHERE phone IS NULL
LIMIT 20;
Ergebnis — erste 5 von 20 Zeilen
| id | first_name | last_name | phone |
|---|---|---|---|
| 2 | Mateo | Costa | NULL |
| 9 | Sven | Smith | NULL |
| 21 | Layla | Fischer | NULL |
| 25 | Freya | Nguyen | NULL |
| 28 | Priya | Jang | NULL |
Und hier ist die Abfrage, die die meisten zuerst schreiben:
7
-- 279 customers have no phone number, and this finds none of them.
SELECT id, first_name, last_name, phone
FROM customers
WHERE phone = NULL;
Keine Zeilen
Keine Zeilen. Kein Fehler, keine Warnung – ein leeres Raster.
NULL ist kein Wert, sondern die Abwesenheit eines Werts, deshalb kann kein Vergleich damit wahr sein. phone = NULL fragt "ist dieses unbekannte Ding gleich jenem unbekannten Ding", und die ehrliche Antwort lautet "unbekannt", was nicht wahr ist, also fällt die Zeile heraus. Auch NULL = NULL ist nicht wahr. Die einzigen Tests, die funktionieren, sind IS NULL und IS NOT NULL.
Was Sie jetzt können
Sie können fast jede Bedingung über eine Tabelle ausdrücken. Die verbleibende Grenze ist weiterhin, dass alles in einer Tabelle liegt – und die Fragen, die sich zu stellen lohnen, tun das meist nicht.