SQL-Abfrage: Werte vergleichen mit dem Schlüsselwort „IN“
Das SQL-Schlüsselwort IN und NOT IN: Einfach erklärt mit Beispielen
Zwei der nützlichsten Werkzeuge sind die Schlüsselwörter IN und NOT IN. Sie helfen dir, Werte aus einer bestimmten Liste gezielt auszuwählen oder auszuschließen. Dies ist besonders praktisch, wenn du mit mehreren bestimmten Werten gleichzeitig arbeiten möchtest.
In diesem Artikel erkläre ich dir, was IN und NOT IN bedeuten, wie sie funktionieren, wie man sie mit Alternativen vergleicht und wie man Sonderfälle handhabt – ganz leicht verständlich, ohne Fachjargon.
Was ist IN?
Das Schlüsselwort IN wird in SQL verwendet, um Daten zu suchen, die einem von mehreren Werten aus einer Liste entsprechen. Es ist eine Kurzform, um mehrere Bedingungen eleganter und einfacher zu schreiben, statt jeden Wert einzeln anzuführen.
Kurz erklärt:
- Du sagst der Datenbank: „Zeig mir die Zeilen, wo ein bestimmter Wert in meiner Liste vorkommt.“
So sieht eine IN-Abfrage aus:
SELECT * FROM tabelle
WHERE spalte IN (wert1, wert2, wert3);
- tabelle: Deine Tabelle, aus der du Daten holen willst.
- spalte: Die Spalte, die geprüft wird.
- wert1, wert2, wert3: Die Liste von Werten, die du suchst.
Was ist NOT IN?
Das Gegenteil von IN ist NOT IN. Während IN nach Werten sucht, die in der Liste vorhanden sind, sucht NOT IN nach Werten, die nicht in der Liste enthalten sind. Es schließt also alle Angaben in deiner Liste aus.
So sieht eine NOT IN-Abfrage aus:
SELECT * FROM tabelle
WHERE spalte NOT IN (wert1, wert2, wert3);
- NOT IN bedeutet: „Zeig mir alles außer den Werten in der Liste.“
Beispiel 1: IN und NOT IN mit Zahlen
Angenommen, du hast eine Tabelle personen
, die folgenden Inhalt enthält:
id | name | alter |
---|---|---|
1 | Anna | 22 |
2 | Ben | 30 |
3 | Chris | 25 |
4 | Dana | 27 |
5 | Elias | 34 |
1.1 IN – nur Personen mit bestimmten Alterswerten
Du möchtest alle Personen anzeigen, die 22, 25 oder 27 Jahre alt sind.
SQL-Abfrage:
SELECT * FROM personen
WHERE alter IN (22, 25, 27);
Ergebnis:
id | name | alter |
---|---|---|
1 | Anna | 22 |
3 | Chris | 25 |
4 | Dana | 27 |
1.2 NOT IN – Personen ausschließen
Jetzt möchtest du alle Personen sehen, deren Alter nicht 22, 25 oder 27 ist.
SQL-Abfrage:
SELECT * FROM personen
WHERE alter NOT IN (22, 25, 27);
Ergebnis:
id | name | alter |
---|---|---|
2 | Ben | 30 |
5 | Elias | 34 |
Alternative zu IN: Der OR-Operator
Der OR-Operator ist eine andere Möglichkeit, Ergebnisse zu filtern, die unterschiedlichen Werten entsprechen. Anstatt IN zu verwenden, könntest du denselben Effekt mit OR erzielen.
Vergleich: IN vs. OR
Abfrage mit IN:
SELECT * FROM personen
WHERE alter IN (22, 25, 27);
Abfrage mit OR:
SELECT * FROM personen
WHERE alter = 22 OR alter = 25 OR alter = 27;
Beide Abfragen liefern dasselbe Ergebnis:
id | name | alter |
---|---|---|
1 | Anna | 22 |
3 | Chris | 25 |
4 | Dana | 27 |
Was ist schneller: IN oder OR?
- IN ist schneller, wenn du mit sehr vielen Werten arbeitest, weil die Datenbank eine klare Liste berücksichtigt und nicht jeden Wert einzeln überprüfen muss. Es ist also effizienter.
- OR erzeugt bei vielen Einträgen oft eine längere Abfrage und kann die Verarbeitung erheblich verlangsamen.
Beispiel:
Wenn du nach 50 verschiedenen Alterswerten suchst, sieht eine OR-Abfrage so aus:
WHERE alter = 22 OR alter = 23 OR alter = 24 ... (bis zu 50 Werte)
Das ist umständlich und für die Datenbank schwierig zu verarbeiten. Mit IN dagegen:
WHERE alter IN (22, 23, 24, ..., 50);
Lösung:
- Verwende IN, wenn du mehrere Werte prüfen möchtest.
- OR eignet sich besser bei wenigen Bedingungen oder wenn du mehr logische Verknüpfungen (z. B. mit AND) benötigst.
Sonderfälle bei IN und NOT IN
Sonderfall 1: Was passiert mit NULL
?
Wenn in deiner Tabelle ein Wert den Zustand NULL
hat (SQLs Bezeichnung für „keine Informationen“), kann das zu besonderen Ergebnissen führen:
id | name | alter |
---|---|---|
1 | Anna | 22 |
2 | Ben | 30 |
3 | Chris | NULL |
4 | Dana | 27 |
5 | Elias | 34 |
Abfrage mit NOT IN:
SELECT * FROM personen
WHERE alter NOT IN (22, 27);
Erwartetes Ergebnis: Alle Werte außer 22 und 27.
Tatsächliches Ergebnis:
id | name | alter |
---|
Warum?
NOT IN ignoriert alle Zeilen, bei denen der Vergleich mit NULL
nicht eindeutig ist. Weil NULL
nicht als „kleiner“, „größer“ oder „gleich“ eingestuft werden kann, schließt die Abfrage diese Zeilen komplett aus.
Lösung: Du musst NULL
explizit behandeln:
SELECT * FROM personen
WHERE alter NOT IN (22, 27) OR alter IS NULL;
Jetzt bekommst du ein korrektes Ergebnis:
id | name | alter |
---|---|---|
2 | Ben | 30 |
3 | Chris | NULL |
5 | Elias | 34 |
Sonderfall 2: Automatische Reihenfolge von IN
Ein häufiges Missverständnis bei IN ist die Annahme, dass die Reihenfolge in der Liste eine besondere Rolle spielt – z. B. zuerst „22“, dann „27“. Das stimmt aber nicht: SQL führt keine Sortierung oder spezielle Reihenfolge ein, sondern prüft nur, ob ein Wert in der Liste vorkommt.
Beispiel 2: IN mit Text
Wenn du mehrere Textwerte vergleichen möchtest, ist IN besonders nützlich. Nehmen wir an, du hast folgende Tabelle produkte
:
id | produktname |
---|---|
1 | Apfel |
2 | Banane |
3 | Kirsche |
4 | Litschi |
5 | Mango |
Suche alle Produkte, die „Apfel“, „Banane“ oder „Mango“ heißen:
Abfrage mit IN:
SELECT * FROM produkte
WHERE produktname IN ('Apfel', 'Banane', 'Mango');
Ergebnis:
id | produktname |
---|---|
1 | Apfel |
2 | Banane |
5 | Mango |
Auch hier kannst du stattdessen OR verwenden:
SELECT * FROM produkte
WHERE produktname = 'Apfel' OR produktname = 'Banane' OR produktname = 'Mango';
Fazit
- IN ist ein einfaches Werkzeug, um Werte aus einer Liste schnell zu vergleichen.
- NOT IN hilft, ganz gezielt Werte auszuschließen, aber du musst auf
NULL
-Werte achten. - Im Vergleich zum OR-Operator ist IN kürzer, lesbarer und bei größeren Listen effizienter.
- Alternatives Schreiben mit OR macht Sinn, wenn deine Bedingungen überschaubar und logisch voneinander getrennt sind.