EXISTS und NOT EXISTS
Zugehörige Zeilen effizient prüfen
EXISTS und NOT EXISTS 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.
Was ist EXISTS?
Der Operator EXISTS prüft, ob eine Unterabfrage mindestens eine Zeile zurückgibt. Er ergibt TRUE, wenn die Unterabfrage ein beliebiges Ergebnis liefert, und FALSE, wenn sie leer ist.
Im Gegensatz zu anderen Unterabfrageoperatoren, die Werte vergleichen, berücksichtigt EXISTS nur das Vorhandensein – die von der Unterabfrage zurückgegebenen Daten selbst werden nicht betrachtet.
Beispieltabellen einrichten
Bevor wir EXISTS-Abfragen schreiben, erstellen wir zwei Tabellen: customers und orders. Wir verwenden sie in dieser Lektion, um die Funktionsweise von EXISTS und NOT EXISTS in der Praxis zu untersuchen.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
country VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
order_date DATE
);
INSERT INTO customers VALUES
(1, 'Alice', 'US'),
(2, 'Bob', 'UK'),
(3, 'Charlie', 'US'),
(4, 'Diana', 'DE');
INSERT INTO orders VALUES
(101, 1, 250.00, '2024-01-10'),
(102, 1, 180.00, '2024-02-15'),
(103, 2, 95.00, '2024-03-01'),
(104, 3, 430.00, '2024-03-22');Grundlegende EXISTS-Syntax
Die grundlegende Syntax von EXISTS verwendet den Operator innerhalb einer WHERE-Klausel. Die Unterabfrage in EXISTS verweist üblicherweise auf eine Spalte der äußeren Abfrage – dies wird als korrelierte Unterabfrage bezeichnet.
Die folgende Abfrage findet alle Kundinnen und Kunden, die mindestens eine Bestellung aufgegeben haben.
SELECT customer_id, name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);SELECT 1 innerhalb von EXISTS
Vielleicht ist Ihnen aufgefallen, dass die Unterabfrage SELECT 1 verwendet, statt eine tatsächliche Spalte auszuwählen. Das ist beabsichtigt – EXISTS prüft nur, ob Zeilen existieren, nicht, welchen Inhalt sie haben.
Die Verwendung von SELECT 1 (oder sogar SELECT *) macht für das Ergebnis keinen Unterschied, aber SELECT 1 signalisiert sowohl der Datenbank-Engine als auch den Lesenden eindeutig, dass die tatsächlichen Werte keine Rolle spielen.
-- Both of these return the same result
SELECT name FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
SELECT name FROM customers c
WHERE EXISTS (SELECT o.* FROM orders o WHERE o.customer_id = c.customer_id);So wertet die Datenbank EXISTS aus
Für jede Zeile der äußeren Abfrage führt die Datenbank die korrelierte Unterabfrage aus. Sobald eine übereinstimmende Zeile gefunden wurde, beendet die Engine die Suche und setzt EXISTS auf TRUE – diese Kurzschlussauswertung macht EXISTS selbst bei großen Tabellen sehr effizient.
Im Gegensatz dazu erstellt ein JOIN den vollständigen Satz übereinstimmender Zeilen, bevor gefiltert wird. Das kann langsamer sein, wenn Sie nur wissen müssen, ob eine Übereinstimmung existiert.
-- EXISTS short-circuits after first match
-- Efficient even when orders table has millions of rows
SELECT name, country
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND o.amount > 200
);NOT EXISTS: Fehlende Zeilen finden
NOT EXISTS ist das Gegenteil: Es gibt TRUE zurück, wenn die Unterabfrage keine übereinstimmenden Zeilen findet. Dies ist die standardmäßige SQL-Methode, um Fragen zu beantworten wie „Welche Kunden haben noch nie eine Bestellung aufgegeben?“
Der Versuch, dies mit einem gewöhnlichen JOIN oder NOT IN zu lösen, kann bei NULL-Werten zu falschen Ergebnissen führen – NOT EXISTS vermeidet diese Falle vollständig.
-- Customers who have NOT placed any order
SELECT customer_id, name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);NOT EXISTS vs. NOT IN mit NULL-Werten
Ein entscheidender Vorteil von NOT EXISTS gegenüber NOT IN ist die NULL-Sicherheit. Wenn die von NOT IN verwendete Unterabfrage auch nur ein NULL zurückgibt, wird der gesamte NOT-IN-Ausdruck zu NULL – dadurch gibt die äußere Abfrage keine Zeilen zurück.
NOT EXISTS ist gegen dieses Problem immun, da es die Existenz von Zeilen und nicht die Wertgleichheit auswertet.
-- Dangerous: if any customer_id in orders is NULL,
-- NOT IN returns zero rows!
SELECT name FROM customers
WHERE customer_id NOT IN (SELECT customer_id FROM orders);
-- Safe: NOT EXISTS handles NULLs correctly
SELECT name FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id
);EXISTS mit mehreren Bedingungen
Die Unterabfrage innerhalb von EXISTS kann beliebiges gültiges SQL enthalten, einschließlich mehrerer WHERE-Bedingungen. So können Sie nach sehr spezifischen verknüpften Zeilen suchen – beispielsweise nach Kunden, die in einem bestimmten Monat eine Bestellung über einem festgelegten Schwellenwert aufgegeben haben.
-- Customers who placed an order over 200 in March 2024
SELECT c.name, c.country
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND o.amount > 200
AND o.order_date >= '2024-03-01'
AND o.order_date < '2024-04-01'
);EXISTS in DELETE und UPDATE
EXISTS ist nicht auf SELECT-Anweisungen beschränkt. Sie können es in UPDATE und DELETE verwenden, um Zeilen basierend auf dem Vorhandensein zugehöriger Daten in einer anderen Tabelle zu ändern oder zu löschen.
Das folgende Beispiel löscht Bestellungen von Kunden aus einem bestimmten Land.
-- Delete orders placed by US customers
DELETE FROM orders o
WHERE EXISTS (
SELECT 1
FROM customers c
WHERE c.customer_id = o.customer_id
AND c.country = 'US'
);EXISTS und JOIN im Vergleich
EXISTS und JOIN können oft dieselbe Frage ausdrücken, verhalten sich aber unterschiedlich. Ein JOIN vervielfacht Zeilen, wenn mehrere Übereinstimmungen vorhanden sind; EXISTS gibt jede äußere Zeile höchstens einmal zurück.
Wenn Sie nur wissen müssen, ob eine Beziehung existiert (und keine Daten aus der verknüpften Tabelle abrufen), ist EXISTS übersichtlicher und in der Regel schneller.
-- JOIN may return duplicate customer rows if a customer has multiple orders
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id;
-- EXISTS always returns each customer once
SELECT c.name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id
);NOT EXISTS für Datenqualitätsprüfungen
NOT EXISTS ist ein leistungsfähiges Werkzeug für Datenqualitätsprüfungen. Sie können es verwenden, um verwaiste Datensätze, fehlende Referenzen oder Zeilen zu finden, für die zugehörige Daten vorhanden sein sollten, aber fehlen.
Die folgende Abfrage erkennt alle Bestellzeilen, deren customer_id mit keiner Zeile in der Tabelle customers übereinstimmt – ein Hinweis auf eine verletzte referenzielle Integrität.
-- Find orders with no matching customer (orphaned records)
SELECT o.order_id, o.customer_id, o.amount
FROM orders o
WHERE NOT EXISTS (
SELECT 1
FROM customers c
WHERE c.customer_id = o.customer_id
);Kurztest
Testen Sie Ihr Verständnis von EXISTS und NOT EXISTS.
Zusammenfassung der Lektion
In dieser Lektion haben Sie gelernt, wie EXISTS und NOT EXISTS das Vorhandensein oder Fehlen zugehöriger Zeilen prüfen, ohne Werte direkt zu vergleichen.
Wichtige Erkenntnisse:
- EXISTS gibt TRUE zurück, sobald die Unterabfrage eine übereinstimmende Zeile findet (Kurzschlussauswertung).
- NOT EXISTS gibt TRUE zurück, wenn die Unterabfrage keine übereinstimmenden Zeilen findet.
- Verwenden Sie
SELECT 1innerhalb von EXISTS – die zurückgegebenen Werte sind irrelevant. - NOT EXISTS ist NULL-sicher, NOT IN nicht – bevorzugen Sie NOT EXISTS, wenn NULL-Werte auftreten können.
- EXISTS funktioniert in SELECT-, UPDATE- und DELETE-Anweisungen.
- Wenn Sie nur die Existenz prüfen müssen, ist EXISTS oft übersichtlicher und schneller als ein JOIN.
Häufig gestellte Fragen
Ist die Lektion „EXISTS und NOT EXISTS“ kostenlos?
Ja — der vollständige Text von „EXISTS und NOT EXISTS“ 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 „EXISTS und NOT EXISTS“?
Zugehörige Zeilen effizient prüfen 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 „EXISTS und NOT EXISTS“?
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
- Korrellierte Unterabfragen
- EXISTS und NOT EXISTS
- IN vs. ANY vs. ALL
- EXISTS- vs. JOIN-Performance