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 ALL behä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 – zwei NULL-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.