SQL Abfrage mehrere Werte: So filterst du Daten sauber, schnell und ohne Umwege
SQL Abfrage mehrere Werte ist einer der Fälle, die ständig vorkommen: mehrere IDs, mehrere Namen, mehrere Status, mehrere E-Mails. Und genau hier machen viele unnötig komplizierte Queries. Ich halte es einfach. Ich zeige dir die besten Methoden, wann du IN nutzt, wann OR Sinn macht und wann du besser mit einer Tabelle arbeitest.
SQL Abfrage mehrere Werte mit IN
Wenn ich mehrere feste Werte abfragen will, nehme ich fast immer IN. Das ist die sauberste und lesbarste Lösung.
SELECT *
FROM kunden
WHERE status IN ('aktiv', 'wartend', 'gesperrt');
Das bedeutet: Gib mir alle Datensätze, bei denen status einer dieser Werte ist. Kein unnötiges OR-Chaos. Kein Lesefrust.
Wann ich IN verwende:
- wenn ich mehrere konkrete Werte prüfen will
- wenn die Liste überschaubar ist
- wenn ich die Query schnell lesbar halten will
SQL Abfrage mehrere Werte mit OR
OR funktioniert auch. Ich nutze es nur, wenn ich wirklich unterschiedliche Bedingungen habe, die nicht sauber mit IN ausdrückbar sind.
SELECT *
FROM kunden
WHERE status = 'aktiv'
OR status = 'wartend'
OR status = 'gesperrt';
Das Ergebnis ist dasselbe wie bei IN. Aber die Query ist länger und schwerer zu pflegen. Wenn du zehn Werte hast, willst du OR nicht mehr lesen. Ich auch nicht.
Mein klarer Standard: Wenn es nur um mehrere Werte in derselben Spalte geht, verwende ich IN.
SQL Abfrage mehrere Werte aus einer Liste
Oft kommen die Werte nicht direkt aus dem Code, sondern aus einer Liste, einem Frontend oder einer API. Dann wird es wichtiger, sauber zu arbeiten.
Ein typisches Beispiel:
SELECT *
FROM produkte
WHERE kategorie_id IN (1, 3, 7, 9);
Das ist perfekt, solange die Werte fest sind. Wenn die Liste dynamisch von außen kommt, gilt: nie blind Strings zusammenbauen. Sonst baust du dir Sicherheitsprobleme ein.
Wenn du Parameter verwendest, bist du auf der sicheren Seite. Dazu kannst du dich an den offiziellen Grundlagen zu Prepared Statements orientieren, zum Beispiel bei PHP mysqli prepared statements oder allgemein bei PostgreSQL PREPARE.
SQL Abfrage mehrere Werte mit mehreren Spalten
Manchmal willst du nicht nur mehrere Werte in einer Spalte prüfen, sondern mehrere Bedingungen gleichzeitig. Dann musst du logisch sauber denken.
SELECT *
FROM bestellungen
WHERE status IN ('offen', 'versendet')
AND zahlungsart IN ('karte', 'paypal');
Hier kombiniere ich zwei IN-Abfragen. Das ist stark, weil die Query lesbar bleibt und ich die Logik klar trenne.
Merke dir das:
IN= mehrere Werte für eine SpalteAND= beide Bedingungen müssen stimmenOR= eine von mehreren Bedingungen reicht
SQL Abfrage mehrere Werte mit Unterabfrage
Wenn die Werte nicht fix sind, sondern aus einer anderen Tabelle kommen, nutze ich eine Unterabfrage. Das ist oft die beste Lösung für echte Datenmodelle.
SELECT *
FROM kunden
WHERE id IN (
SELECT kunden_id
FROM bestellungen
WHERE status = 'offen'
);
Hier hole ich alle Kunden, die offene Bestellungen haben. Genau dafür sind Unterabfragen da. Ich muss keine Werte manuell eintragen. Die Datenbank macht die Arbeit.
SQL Abfrage mehrere Werte mit JOIN
In vielen Fällen ist ein JOIN sogar besser als eine Unterabfrage. Vor allem, wenn ich Daten aus mehreren Tabellen brauche.
SELECT k.id, k.name, b.status
FROM kunden k
JOIN bestellungen b ON b.kunden_id = k.id
WHERE b.status IN ('offen', 'versendet');
Ich nehme JOIN, wenn ich nicht nur filtern, sondern auch kombinieren will. Das spart oft Zeit und macht Reports stärker.
Häufige Fehler bei SQL Abfrage mehrere Werte
Ich sehe immer wieder dieselben Fehler. Die meisten sind leicht zu vermeiden.
- Falsche Anführungszeichen: Strings gehören in einfache Quotes, Zahlen normalerweise nicht.
- Zu viele ORs: Mach die Query nicht unnötig lang.
- Ungesicherte Eingaben: Baue keine SQL-Strings direkt aus User-Input.
- Leere Listen: Eine leere
IN-Liste ist kein sinnvoller Query-Start. - Unklare Logik: Setze Klammern, wenn
ANDundORzusammenkommen.
So mache ich es in der Praxis
Wenn ich eine SQL Abfrage mehrere Werte baue, gehe ich immer nach derselben Reihenfolge vor:
- Ich prüfe zuerst: Geht es um eine Spalte mit mehreren Werten? Dann nehme ich
IN. - Kommt die Liste von außen? Dann arbeite ich mit Parametern.
- Kommt die Liste aus einer anderen Tabelle? Dann prüfe ich
JOINoder Unterabfrage. - Wenn Bedingungen gemischt werden, setze ich Klammern bewusst.
- Ich halte die Query so kurz wie möglich, aber nicht kürzer als verständlich.
Das ist nicht fancy. Es ist einfach effektiv.
Wann ist IN nicht die beste Lösung?
IN ist stark, aber nicht immer ideal. Ich nutze es nicht blind.
Ich weiche aus, wenn:
- die Werte sehr dynamisch und groß sind
- ich komplexe Beziehungen zwischen Tabellen prüfen muss
- ich bessere Performance mit einem
JOINerwarte - ich nur teils ähnliche Bedingungen abfragen will
Bei großen Datenmengen lohnt sich ein Blick auf den Ausführungsplan. Viele Datenbanken bieten dafür gute Werkzeuge. Für PostgreSQL ist der EXPLAIN-Befehl der richtige Startpunkt.
Fazit: SQL Abfrage mehrere Werte sauber lösen
Wenn du mehrere Werte abfragen willst, ist die beste Lösung meistens klar: IN statt langer OR-Ketten. Wenn die Werte aus anderen Tabellen kommen, denk über JOIN oder Unterabfragen nach. Und wenn Daten von außen kommen, arbeite mit Parametern.
Mein Ziel ist immer dasselbe: lesbar, sicher, wartbar. Genau so baue ich jede SQL Abfrage mehrere Werte.