SQL WHERE: Zeilen mit AND, OR und NULL filtern
Die SQL-WHERE-Klausel ist eine SQL-Klausel, die Tabellenzeilen per Bedingung filtert. In einer SQL-Abfrage mit WHERE bleiben nur Zeilen erhalten, deren Prädikat zu TRUE auswertet; sowohl FALSE als auch NULL/UNKNOWN werden ausgeschlossen. Diese dreiwertige Logik ist die häufigste Ursache für unerwartetes WHERE-Verhalten rund um NULL.
SQL WHERE-Klausel Beispiel für Zeilenfilterung
Ausgabe:
Die Ausgabe erscheint hier...
Ausgabe:
+----------+-------------+-------+
| name | kategorie | preis |
+----------+-------------+-------+
| Tastatur | Elektronik | 49.99 |
| Maus | Elektronik | 25.0 |
+----------+-------------+-------+
2 row(s)
So funktioniert dieses Beispiel
CREATE TABLEundINSERTbauen eine Tabelleproduktemit vier Zeilen über zwei Kategorien auf.- Die SQL-WHERE-Klausel
kategorie = 'Elektronik' AND preis < 100kombiniert zwei Bedingungen mitAND- beide müssen TRUE sein, damit eine Zeile erscheint. - “Monitor” ist in der Kategorie Elektronik, kostet aber 299.00, deshalb entfernt die Preisbedingung die Zeile. “Notizbuch” scheitert an der Kategorieprüfung. Nur “Tastatur” und “Maus” erfüllen beide Prädikate.
Was ist eine SQL-WHERE-Klausel?
Eine SQL-WHERE-Klausel ist ein boolescher Filter, der auf jede Zeile einzeln angewendet wird. Die Datenbank wertet den Ausdruck für jede Kandidatenzeile aus und behält nur Zeilen, bei denen das Ergebnis TRUE ist. Jeder Ausdruck mit FALSE oder NULL wird verworfen. WHERE arbeitet vor GROUP BY und Aggregatfunktionen, was es von HAVING unterscheidet.
Häufige Fehler bei SQL-WHERE-Klauseln
Fehler: Eine Spalte mit = mit NULL vergleichen.
Falsch:
WHERE kategorie = NULL
Richtig:
WHERE kategorie IS NULL
Warum: = NULL ergibt UNKNOWN, und WHERE filtert UNKNOWN-Zeilen heraus. Verwende IS NULL oder IS NOT NULL.
Fehler: AND und OR ohne Klammern mischen.
Falsch:
WHERE kategorie = 'Büro' OR kategorie = 'Elektronik' AND preis < 50
Richtig:
WHERE (kategorie = 'Büro' OR kategorie = 'Elektronik') AND preis < 50
Warum: AND bindet stärker als OR, daher sind Klammern nötig, um die beabsichtigte Logik abzubilden.
WHERE vs HAVING
| WHERE | HAVING |
|---|---|
| Filtert einzelne Zeilen vor der Gruppierung | Filtert Gruppen nach der Aggregation |
| Kann keine Aggregatfunktionen referenzieren | Kann COUNT, SUM usw. referenzieren |
Reduziert Zeilen vor GROUP BY | Reduziert Gruppen im Endergebnis |
Regel: Verwende WHERE, um Zeilen vor der Aggregation auszuschließen, und HAVING, um Gruppen nach der Aggregation auszuschließen. Frühes Filtern mit WHERE reduziert die Arbeit im Aggregationsschritt.
Performance-Hinweise
WHERE-Prädikate auf indizierten Spalten verwandeln vollständige Tabellenscans in Index-Lookups. Wenn du die Spalte in eine Funktion einpackst - LOWER(name), DATE(created_at) - kann der Optimizer den Index nicht nutzen; transformiere stattdessen den Vergleichswert. Bei mit AND verknüpften Bedingungen liefert ein zusammengesetzter Index in Spaltenreihenfolge der Prädikate die beste Performance. OR-Bedingungen führen oft zu separaten Index-Scans, die zusammengeführt werden und langsamer sind als AND auf demselben Index.
Sicherheitshinweise
Erstelle WHERE-Bedingungen mit parametrierten Abfragen und niemals durch das Konkatenieren von Nutzereingaben in SQL-Strings. Für dynamische Spaltennamen validiere strikt gegen eine Allow-List. Für IN (...)-Listen erzeuge Platzhalter und binde jeden Wert einzeln. Prüfe UPDATE- und DELETE-Statements immer zuerst mit einem SELECT unter derselben WHERE-Klausel, bevor du den Schreibvorgang ausführst.
FAQ
Was ist der Unterschied zwischen WHERE und HAVING in SQL?
WHERE filtert Zeilen vor GROUP BY, HAVING filtert aggregierte Gruppen danach. WHERE kann keine Aggregatfunktionen wie COUNT() oder SUM() referenzieren. Eine Abfrage kann beides nutzen: WHERE verengt die Eingabezeilen, HAVING verengt die gruppierte Ausgabe.
Warum funktioniert = NULL in einer WHERE-Klausel nicht?
SQL nutzt dreiwertige Logik: TRUE, FALSE und UNKNOWN. Jeder Vergleich mit NULL ergibt UNKNOWN, und WHERE verwirft UNKNOWN-Zeilen. Nutze IS NULL, um auf NULL-Werte zu prüfen. Manche Datenbanken unterstützen außerdem IS NOT DISTINCT FROM für NULL-sichere Gleichheitsvergleiche.
Beeinflusst die Reihenfolge in der WHERE-Klausel die Performance?
Der SQL-Standard garantiert keine Auswertungsreihenfolge, und die meisten Optimizer ordnen Prädikate intern um. Schreibe Bedingungen in der Reihenfolge, die am besten lesbar ist. Die Performance hängt von den indizierten Spalten und der Selektivität der Prädikate ab, nicht von der Schreibreihenfolge.