IN und NOT IN für Mengen
Filtern Sie anhand von Wertelisten mit IN und NOT IN, lernen Sie den NULL-Sonderfall bei NOT IN kennen und wechseln Sie für eine sichere Semantik zu EXISTS.
IN und NOT IN für Mengen ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
IN: Mit einer Liste vergleichen
IN ist eine Kurzform für mehrere OR-Ausdrücke:
SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');
-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';IN mit einer Unterabfrage
Auf der rechten Seite können Sie eine Unterabfrage verwenden:
SELECT * FROM orders
WHERE user_id IN (
SELECT id FROM users WHERE country = 'US'
);NOT IN: Eine Liste ausschließen
Übereinstimmende Zeilen herausfiltern:
SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');Die NOT-IN-NULL-Falle
Wenn die rechte Seite NULL enthält, gibt NOT IN NULL zurück – und Zeilen, für die das Prädikat NULL ist, werden verworfen. Das Ergebnis: keine Zeilen.
-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently
-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);Warum NOT EXISTS sicherer ist
NOT EXISTS verwendet die standardmäßige Semantik korrelierter Unterabfragen und ist NULL-sicher. Die meisten Abfrageplaner optimieren es genauso wie ein korrekt formuliertes NOT IN.
IN oder OR – Lesbarkeit
IN ist übersichtlicher als lange OR-Ketten, und der Abfrageplaner optimiert es häufig genauso:
-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...
-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)IN mit Tupeln (Zeilenkonstruktoren)
Paare von Spalten vergleichen:
SELECT * FROM order_items
WHERE (order_id, product_id) IN (
(1, 42), (2, 99), (3, 17)
);Indexverwendung
Eine IN-Liste auf einer indizierten Spalte kann als mehrere Indexsuchen ausgeführt werden (Bitmap Index Scan). Das ist im Allgemeinen schnell.
-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);Große IN-Listen
Listen mit Tausenden von Werten können langsam werden. Bevorzugen Sie:
- einen JOIN mit einer echten oder temporären Tabelle
= ANY(array), um einen Array-Parameter zu übergeben
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);IN mit leerer Liste
Eine leere IN-Liste ist in Standard-SQL unzulässig. Manche Clients übergeben einen Platzhalterwert; sicherer ist es, die SQL-Bedingung bedingt zu erzeugen.
-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.IN oder JOIN
Manchmal ist ein JOIN verständlicher als eine Unterabfrage mit IN:
-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);
-- With JOIN:
SELECT o.*
FROM orders o
JOIN users u ON u.id = o.user_id
WHERE u.pro;Zusammenfassung
IN ist die übersichtliche Form für die Zugehörigkeit zu einer Menge.
- Für bessere Lesbarkeit IN statt OR verwenden
- NOT IN ist bei NULL-Werten gefährlich – bevorzugen Sie NOT EXISTS
- Für große Mengen JOIN verwenden oder Arrays übergeben
Kurzer Check
Was ist der sicherste Ersatz für NOT IN (subquery), wenn die Unterabfrage NULL-Werte enthalten kann?
Häufig gestellte Fragen
Ist die Lektion „IN und NOT IN für Mengen“ kostenlos?
Ja — der vollständige Text von „IN und NOT IN für Mengen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „IN und NOT IN für Mengen“?
Filtern Sie anhand von Wertelisten mit IN und NOT IN, lernen Sie den NULL-Sonderfall bei NOT IN kennen und wechseln Sie für eine sichere Semantik zu EXISTS. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „IN und NOT IN für Mengen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- LIKE-Muster und Platzhalter
- IN und NOT IN für Mengen
- BETWEEN für Wertebereiche
- IS NULL, IS NOT NULL und COALESCE