Stell dir vor, du arbeitest mit einer Uni-Datenbank und musst Studierende finden, die in bestimmten Kursen eingeschrieben sind. Zum Beispiel in "Programmieren", "Mathematik" und "Physik". Klar, du könntest eine lange Query mit vielen Bedingungen schreiben, so wie:
SELECT *
FROM students
WHERE course = 'Programmieren'
OR course = 'Mathematik'
OR course = 'Physik';
Aber mal ehrlich: Solche Konstrukte zu schreiben ist nervig und sieht auch nicht gerade elegant aus. Zum Glück gibt es den IN-Operator, mit dem du die gleiche Query viel kompakter und entspannter schreiben kannst:
SELECT *
FROM students
WHERE course IN ('Programmieren', 'Mathematik', 'Physik');
Klingt fast wie Magie, oder? Statt vielen OR-Bedingungen sagst du SQL einfach, dass es nach Werten aus dieser Liste suchen soll. Und wenn du checken willst, dass ein Wert nicht in der Liste ist, nimmst du NOT IN — Suche alles, was nicht in dieser Liste ist.
Syntax vom IN-Operator
Hier ist die allgemeine Syntax für IN:
SELECT spalten
FROM tabelle
WHERE spalte IN (wert1, wert2, wert3, ...);
Schauen wir uns jetzt ein paar Beispiele an.
Beispiel 1: Studierende, die mehrere Kurse belegen
Angenommen, wir haben die Tabelle students:
| id | name | course |
|---|---|---|
| 1 | Anna | Programmieren |
| 2 | Mello | Physik |
| 3 | Kate | Mathematik |
| 4 | Dan | Chemie |
| 5 | Olly | Biologie |
Wir wollen alle Studierenden finden, die "Programmieren", "Mathematik" oder "Physik" belegen. Wir nutzen IN:
SELECT name, course
FROM students
WHERE course IN ('Programmieren', 'Mathematik', 'Physik');
Ergebnis:
| name | course |
|---|---|
| Anna | Programmieren |
| Mello | Physik |
| Kate | Mathematik |
Wie du siehst, macht IN die Sache viel einfacher. Du musst keine langen OR-Bedingungen schreiben, sondern gibst einfach die Werte an, die dich interessieren.
Beispiel 2: Studierende, die bestimmte Kurse nicht belegen
Jetzt nehmen wir an, du willst Studierende finden, die nicht "Programmieren", "Mathematik" oder "Physik" belegen. Dafür ist NOT IN perfekt:
SELECT name, course
FROM students
WHERE course NOT IN ('Programmieren', 'Mathematik', 'Physik');
Ergebnis:
| name | course |
|---|---|
| Dan | Chemie |
| Olly | Biologie |
So gibt NOT IN alle Zeilen zurück, wo der Wert in course nicht in der angegebenen Liste ist.
IN und NOT IN mit Subqueries
IN und NOT IN sind besonders praktisch, wenn du Daten zwischen zwei Tabellen vergleichen willst. Zum Beispiel, nehmen wir an, wir haben zwei Tabellen:
Tabelle students:
| id | name | course_id |
|---|---|---|
| 1 | Anna | 101 |
| 2 | Mello | 102 |
| 3 | Kate | 103 |
| 4 | Dan | 104 |
Tabelle courses:
| id | name |
|---|---|
| 101 | Programmieren |
| 102 | Physik |
| 103 | Mathematik |
| 105 | Chemie |
Stell dir vor, wir wollen Studierende finden, die in Kursen eingeschrieben sind, die es in der Tabelle courses gibt. Hier hilft ein Subquery mit IN:
SELECT name
FROM students
WHERE course_id IN (
SELECT id
FROM courses
);
So funktioniert die Query: Der Subquery SELECT id FROM courses gibt alle Kurs-IDs zurück. Dann prüft IN, ob course_id in dieser Liste ist.
Ergebnis:
| name |
|---|
| Anna |
| Mello |
| Kate |
Warum fehlt Dan? Weil seine course_id (104) nicht in der Tabelle courses steht.
Besonderheiten mit NULL
Der IN-Operator hat eine wichtige Besonderheit: Wenn in der Werteliste ein NULL auftaucht, kann das das Ergebnis beeinflussen. Schauen wir uns ein Beispiel an.
Tabelle grades:
| student_id | course_id | grade |
|---|---|---|
| 1 | 101 | A |
| 2 | 102 | NULL |
| 3 | 103 | B |
Eine Query, die Studierende mit einer Note in ('A', 'B', 'C') sucht, könnte so aussehen:
SELECT student_id
FROM grades
WHERE grade IN ('A', 'B', 'C');
Ergebnis:
| student_id |
|---|
| 1 |
| 3 |
Der Eintrag mit NULL in der Spalte grade wird ignoriert, weil NULL nie Teil einer Liste ist.
Jetzt stell dir vor, du nutzt NOT IN. Zum Beispiel:
SELECT student_id
FROM grades
WHERE grade NOT IN ('A', 'B', 'C');
Du erwartest vielleicht, dass die Zeile mit student_id = 2 kommt, aber das Ergebnis ist leer! Warum? Weil NULL mit jedem Wert in der Liste verglichen wird und das Ergebnis immer UNKNOWN ist. Das kann verwirrend sein, also achte bei NOT IN auf Spalten mit NULL. Am besten prüfst du NULL explizit:
SELECT student_id
FROM grades
WHERE grade NOT IN ('A', 'B', 'C')
OR grade IS NULL;
Ergebnis:
| student_id |
|---|
| 2 |
Tipps für IN und NOT IN
Nutze IN für bessere Lesbarkeit deines SQL-Codes
Wenn du prüfen willst, ob eine Spalte in einer bestimmten Werteliste ist, nimm immer IN statt vielen OR-Bedingungen.
Sei vorsichtig mit NOT IN und NULL
Wenn es Spalten mit NULL gibt, können die Ergebnisse unerwartet sein. Behandle NULL am besten explizit, wenn du NOT IN nutzt.
Nutze Indizes für schnellere Subqueries
Wenn du IN mit einem Subquery verwendest, achte darauf, dass die Spalte im Subquery einen Index hat, damit die Performance nicht leidet.
Praxisbeispiel
Stell dir vor, du arbeitest im System eines Online-Shops. Du hast die Tabellen orders und users. Du willst alle User finden, die nie eine Bestellung gemacht haben.
Tabelle users:
| id | name |
|---|---|
| 1 | Anna |
| 2 | Mello |
| 3 | Kate |
| 4 | Dan |
Tabelle orders:
| id | user_id | total |
|---|---|---|
| 1 | 1 | 500 |
| 2 | 3 | 300 |
Wir nutzen NOT IN für die Lösung:
SELECT name
FROM users
WHERE id NOT IN (
SELECT user_id
FROM orders
);
Ergebnis:
| name |
|---|
| Mello |
| Dan |
So funktioniert die Query: Erst gibt der Subquery SELECT user_id FROM orders die IDs aller User zurück, die Bestellungen gemacht haben (1 und 3). Dann schließt NOT IN diese aus, sodass nur die übrig bleiben, die nie bestellt haben (Mello und Dan).
GO TO FULL VERSION