SQL INTERSECT ist ein Mengenoperator: Er liefert nur die Zeilen, die in beiden Ergebnismengen vorkommen – die Schnittmenge zweier Abfragen. INTERSECT eignet sich, wenn man gemeinsame Daten aus zwei Perspektiven finden will, etwa Kunden, die sowohl Produkt A als auch Produkt B gekauft haben.
So funktioniert INTERSECT
INTERSECT verbindet zwei oder mehr SELECT-Anweisungen vertikal. Es gelten dieselben Regeln wie bei UNION: Beide Abfragen müssen die gleiche Anzahl Spalten mit kompatiblen Datentypen liefern.
SELECT kunden_id FROM bestellungen WHERE produkt = 'A'
INTERSECT
SELECT kunden_id FROM bestellungen WHERE produkt = 'B';
Das Ergebnis enthält nur Kunden, die in beiden Abfragen auftauchen.
Duplikate und NULL-Werte
- Standardmäßig entfernt INTERSECT doppelte Zeilen – jede Zeile erscheint höchstens einmal.
INTERSECT ALLbehält Duplikate: Eine Zeile erscheint so oft, wie sie in beiden Mengen gemeinsam vorkommt (Multiplizität = Minimum der beiden Häufigkeiten).- Bei der Duplikat-Entfernung behandelt INTERSECT
NULL-Werte als gleich – zweiNULL-Zeilen gelten als identisch.
Operator-Reihenfolge
INTERSECT bindet stärker als UNION und EXCEPT: a EXCEPT b INTERSECT c wird als a EXCEPT (b INTERSECT c) ausgewertet. Mit Klammern lässt sich die Reihenfolge immer eindeutig festlegen.
Verfügbarkeit
- MySQL ab 8.0.31 und MariaDB ab 10.3 unterstützen INTERSECT.
- PostgreSQL, SQL Server, Oracle und SQLite beherrschen INTERSECT seit langem.
Wer statt der Schnittmenge die Unterschiede zweier Abfragen braucht, verwendet EXCEPT; wer prüfen will, ob überhaupt passende Zeilen existieren, nutzt EXISTS.
Grundlagen zu Abfragen finden sich unter SQL-Grundlagen.