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:

idnamealter
1Anna22
2Ben30
3Chris25
4Dana27
5Elias34

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:

idnamealter
1Anna22
3Chris25
4Dana27

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:

idnamealter
2Ben30
5Elias34

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:

idnamealter
1Anna22
3Chris25
4Dana27

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:

idnamealter
1Anna22
2Ben30
3ChrisNULL
4Dana27
5Elias34

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:

idnamealter

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:

idnamealter
2Ben30
3ChrisNULL
5Elias34

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:

idproduktname
1Apfel
2Banane
3Kirsche
4Litschi
5Mango

Suche alle Produkte, die „Apfel“, „Banane“ oder „Mango“ heißen:

Abfrage mit IN:

SELECT * FROM produkte
WHERE produktname IN ('Apfel', 'Banane', 'Mango');

Ergebnis:

idproduktname
1Apfel
2Banane
5Mango

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.