CodeGym /Kurse /SQL SELF /Daten filtern mit IN und NOT IN

Daten filtern mit IN und NOT IN

SQL SELF
Level 13 , Lektion 2
Verfügbar

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 INSuche 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).

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION