WHERE: Zeilen filtern
Kurz gesagt: WHERE behält nur die Zeilen, die zu einer Bedingung passen, die aus Vergleichen und AND, OR und NOT gebaut ist.
Problem
Was ist ausverkauft?
Jeden Morgen will die Chefin wissen, welche Produkte nachbestellt werden müssen, weil sie ausverkauft sind. Die Tabelle hat 25 Produkte. Morgen hat sie 2500.
Sie braucht nicht alle Zeilen. Sie braucht nur die, bei denen der Lagerbestand 0 ist.
Die Idee
WHERE
WHERE behält nur die Zeilen, für die die Bedingung wahr ist:
Die Datenbank geht jede Zeile durch, prüft stock = 0 und behält die wahren. Die Bedingung kann jede Spalte benutzen, nicht nur die in SELECT.
Die Vergleiche sind: = gleich, <> ungleich, <, >, <=, >=. Zahlen werden mit Dezimalpunkt geschrieben:
Text steht in einfachen Anführungszeichen:
Genauer, für Neugierige
SQLite akzeptiert auch city = "Plovdiv" in doppelten Anführungszeichen, aber nur aus alter Gewohnheit: Wenn es keine Spalte mit diesem Namen gibt, nimmt es den Ausdruck als Text. PostgreSQL meldet, dass es keine Spalte „Plovdiv“ gibt. Schreib Text in einfache Anführungszeichen, dann funktioniert die Abfrage überall.
Probier es aus
Die teuren Produkte
Zeige Name und Preis der Produkte, die mindestens 10 € kosten.
Lösung
SELECT name, price FROM products WHERE price >= 10;WHERE price >= 10. Sechs Produkte, vom Schneidebrett (11,40 €) bis zum Messerset (39 €). „Mindestens 10“ schließt 10 ein, also >= und nicht >.
Die Idee
AND, OR, NOT
Bedingungen lassen sich kombinieren:
AND: beide müssen wahr sein.OR: mindestens eine ist wahr.NOT: dreht die Bedingung um.
Günstige Produkte gibt es genug (für ein Angebot „nimm drei“):
Sieh es dir an
Die OR-Falle
Das Marketing will die Kunden aus Sofia oder Plovdiv, die sich seit Anfang 2026 angemeldet haben. Hier ein erster Versuch. Führe ihn aus und sieh dir die Daten an:
Mit Klammern sagt die Bedingung genau, was du meinst:
Wann immer du AND und OR mischst, setze Klammern, auch wenn sie nicht nötig sind. Wer die Abfrage nach dir liest, muss nicht rätseln.
Probier es aus
Die wartenden Bestellungen
Zeige Nummer, Kunde und Status der Bestellungen, die new oder paid sind, aber noch nicht verschickt.
Lösung
SELECT id, customer_id, status FROM orders WHERE status = 'new' OR status = 'paid';WHERE status = 'new' OR status = 'paid'. 23 Bestellungen: 11 neue und 12 bezahlte. Mit AND statt OR kommt nichts heraus, denn eine Bestellung hat einen Status.
Übung
Zwei Aufgaben
1. Alle Bestellungen außer den stornierten (cancelled). Zeige Nummer und Status. Probiere es mit NOT.
Die Bestellungen, die nicht storniert sind:
Lösung
SELECT id, status FROM orders WHERE NOT status = 'cancelled';WHERE NOT status = 'cancelled' oder kürzer WHERE status <> 'cancelled'. 53 Bestellungen.
2. Der Shop eröffnet ein Lager an der Küste. Welche Kunden aus Varna oder Burgas sind seit 2025 bei uns? Zeige Name, Stadt und Anmeldedatum.
Kunden aus Varna oder Burgas, die sich vor 2026 angemeldet haben:
Lösung
SELECT name, city, joined_at FROM customers
WHERE (city = 'Varna' OR city = 'Burgas') AND joined_at < '2026-01-01';WHERE (city = 'Varna' OR city = 'Burgas') AND joined_at < '2026-01-01'. Datumsangaben sind Text in der Form Jahr-Monat-Tag, also vergleicht < sie richtig. Ohne die Klammern käme auch Hristo aus Varna heraus, der sich 2026 angemeldet hat.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: SELECT: Spalten auswählen
- Geht weiter in: IN, BETWEEN und LIKE · NULL: kein Wert · ORDER BY, LIMIT und DISTINCT · Rechnen in einer Abfrage
- Aufgaben zum Thema: Daten lesen