Direkt zum Hauptinhalt springen
eLearner.app
Modul 5 · Lektion 4 von 420/57 im Kurs~12 min
Lektionen des Moduls (4/4)

UNION, INTERSECT, EXCEPT (und CROSS JOIN)

Bisher haben Sie Daten horizontal kombiniert: JOIN fügt Spalten an aus verwandten Zeilen. SQL bietet auch eine weitere Familie von Operatoren an kombiniert Daten vertikal und behandelt die Ergebnisse von zwei SELECTs als Setzt: UNION, INTERSECT, EXCEPT. Wir besuchen auch CROSS JOIN, das kartesisches Produkt.

CROSS JOIN: jede Zeile mit jeder Zeile

CROSS JOIN hat kein ON: Es erzeugt jede mögliche Kombination von Zeilen zwischen zwei Tabellen (kartesisches Produkt). Wenn A n Zeilen hat und B hat m Zeilen, das Ergebnis hat n × m.

SQL
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM   customers c
CROSS JOIN products p;

12 Kunden × 16 Produkte = 192 Zeilen. Es wird selten für reale Daten verwendet (es ist teuer!), aber es ist nützlich für:

  • Generierung von „Alle gegen alle“-Kombinationen (z. B. einer Kompatibilitätsmatrix);
  • Koppeln einer Tabelle mit einer kleinen Tabelle mit Konstanten/Parametern.

UNION und UNION ALL

UNION hängt die Ergebnisse von zwei SELECTs mit der gleichen Nummer und an Art der Spalten:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

Regeln:

  • Die beiden SELECTs müssen die gleiche Anzahl von Spalten haben und kompatibel sein Typen;
  • UNION (ohne ALL) entfernt Duplikate – führt effektiv a aus DISTINCT zum Endergebnis;
  • UNION ALL speichert auch Duplikate und ist dadurch viel schneller vermeidet die Sortierung/Hash für die Deduplizierung.
SQL
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM   customers c JOIN orders  o ON o.customer_id = c.id
UNION
SELECT c.email
FROM   customers c JOIN reviews r ON r.customer_id = c.id;

INTERSECT und EXCEPT

INTERSECT behält nur die Zeilen bei, die in beiden Ergebnissen vorhanden sind; EXCEPT behält die Zeilen der ersten, die nicht in der zweiten sind (die Menge). „Unterschied“).

SQL
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

INTERSECT und EXCEPT entfernen standardmäßig auch Duplikate; die Bei den Varianten INTERSECT ALL/EXCEPT ALL ist dies nicht der Fall.

Probieren Sie es selbst aus

Übung#sql.m5.l4.e1
Versuche: 0Wird geladen…

Finden Sie alle E-Mails der Kunden, die Sie bestellt haben. OPPURE hat sie nicht rezensiert (keine Duplikate). Eine Spalte: E-Mail. Bestellung per E-Mail.

Editor wird geladen…
Hinweis anzeigen

UNION zwischen zwei SELECTs, die dieselbe E-Mail-Spalte zurückgeben. Das ORDER BY folgt am Ende dem Endergebnis.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#sql.m5.l4.e2
Versuche: 0Wird geladen…

Suchen Sie nach einer E-Mail an den Kunden, die Sie bestellt haben, ohne dass Sie ihn erneut gelesen haben. USA AUSSER. Eine Spalte: E-Mail. Bestellung per E-Mail.

Editor wird geladen…
Hinweis anzeigen

EXCEPT behält nur die Zeilen aus dem linken SELECT, die im rechten nicht vorhanden sind.

Lösung nach 3 Versuchen verfügbar