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.
-- 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:
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(ohneALL) entfernt Duplikate – führt effektiv a ausDISTINCTzum Endergebnis;UNION ALLspeichert auch Duplikate und ist dadurch viel schneller vermeidet die Sortierung/Hash für die Deduplizierung.
-- 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“).
-- 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
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.
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
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.
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