SELECT chooses columns, WHERE filters rows. Together they answer "which fields, from which records?" — the slider and the live query above show the result set shrink as you tighten the filter.
Where you meet it
- Every read from a relational database — Postgres, MySQL, SQLite, SQL Server.
- "Active users in Germany", "orders over 100", "the 10 newest posts".
- Behind ORMs and dashboards: the
WHEREyou write becomes the rows you get back.
What it does
SELECT is the projection — it picks which columns come out. WHERE is the filter — it tests every row against a condition and keeps only the ones where that condition is true. Naming columns instead of SELECT * means you fetch only what you need.
SQL reads top to bottom, but runs FROM → WHERE → SELECT → ORDER BY → LIMIT — which is why LIMIT only bites after the sort.
How it works
The WHERE condition is a predicate: an expression that is true, false, or unknown for each row. The row survives only when the predicate is true. Combine predicates with AND (both must hold) and OR (either holds); AND binds tighter than OR, so use parentheses when mixing them.
SELECT id, name, country
FROM users
WHERE age > 30 AND country = 'DE';
The engine doesn't run the clauses top to bottom. The logical order is FROM → WHERE → SELECT → ORDER BY → LIMIT: it gathers the table, drops rows that fail the filter, projects the chosen columns, sorts, and only then cuts to the limit — which is why LIMIT takes the first rows after sorting.
Watch out
- NULL is not a value you can
=against.age = NULLyields unknown, never true, so the row is dropped. Useage IS NULL/IS NOT NULLinstead. - Without
ORDER BY, row order is not guaranteed — soLIMITwithout a sort returns an arbitrary slice. AND/ORmixed without parentheses bites:a OR b AND cmeansa OR (b AND c).
Go deeper
SELECT wählt Spalten, WHERE filtert Zeilen. Zusammen beantworten sie "welche Felder, aus welchen Datensätzen?" — der Slider und die Live-Query oben zeigen, wie die Ergebnismenge schrumpft, je enger du filterst.
Wo es vorkommt
- Jeder Lesezugriff auf eine relationale Datenbank — Postgres, MySQL, SQLite, SQL Server.
- "Aktive Nutzer in Deutschland", "Bestellungen über 100", "die 10 neuesten Posts".
- Hinter ORMs und Dashboards: Das
WHERE, das du schreibst, wird zu den Zeilen, die du zurückbekommst.
Was es tut
SELECT ist die Projektion — es bestimmt, welche Spalten herauskommen. WHERE ist der Filter — es prüft jede Zeile gegen eine Bedingung und behält nur die, bei denen sie wahr ist. Spalten zu benennen statt SELECT * holt nur das Nötige.
SQL liest von oben nach unten, läuft aber FROM → WHERE → SELECT → ORDER BY → LIMIT — darum greift LIMIT erst nach dem Sortieren.
Wie es funktioniert
Die WHERE-Bedingung ist ein Prädikat: ein Ausdruck, der pro Zeile wahr, falsch oder unbekannt ist. Die Zeile bleibt nur, wenn das Prädikat wahr ist. Prädikate kombinierst du mit AND (beide müssen gelten) und OR (eines genügt); AND bindet stärker als OR, also bei Mischung Klammern setzen.
SELECT id, name, country
FROM users
WHERE age > 30 AND country = 'DE';
Die Engine läuft die Klauseln nicht von oben nach unten ab. Die logische Reihenfolge ist FROM → WHERE → SELECT → ORDER BY → LIMIT: erst die Tabelle holen, dann Zeilen verwerfen, die den Filter nicht bestehen, die gewählten Spalten projizieren, sortieren und erst dann auf das Limit kürzen — darum nimmt LIMIT die ersten Zeilen nach dem Sortieren.
Worauf achten
- NULL ist kein Wert, gegen den du mit
=vergleichen kannst.age = NULLergibt unbekannt, nie wahr — die Zeile fliegt raus. Nimm stattdessenage IS NULL/IS NOT NULL. - Ohne
ORDER BYist die Zeilenreihenfolge nicht garantiert —LIMITohne Sortierung liefert also einen beliebigen Ausschnitt. AND/ORohne Klammern beißt:a OR b AND cbedeuteta OR (b AND c).