Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 4 z 420/57 w kursie~12 min
Lekcje modułu (4/4)

UNION, INTERSECT, EXCEPT (i CROSS JOIN)

Jak dotąd połączyłeś dane poziomo: JOIN dołącza kolumny z powiązanych wierszy. SQL oferuje także inną rodzinę operatorów łączy dane pionowo, traktując wyniki dwóch SELECT jako zestawy: UNION, INTERSECT, EXCEPT. Wracamy także do CROSS JOIN, produkt kartezjański.

ŁĄCZENIE KRZYŻOWE: każdy wiersz z każdym wierszem

CROSS JOIN nie ma ON: tworzy każdą możliwą kombinację wiersze między dwiema tabelami (iloczyn kartezjański). Jeśli A ma n wierszy, a B ma m wierszy, wynik ma n × m.

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

12 klientów × 16 produktów = 192 rzędy. Jest rzadko używany w przypadku prawdziwych danych (tj drogie!), ale jest przydatne do:

  • generowanie kombinacji „wszyscy przeciwko wszystkim” (np. macierz kompatybilności);
  • parowanie tabeli z małą tabelą stałych/parametrów.

UNIA i UNIA WSZYSTKICH

UNION dołącza wyniki dwóch SELECT z tym samym numerem i rodzaj kolumn:

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

Zasady:

  • dwa SELECT muszą mieć tę samą liczbę kolumn i być kompatybilne typy;
  • UNION (bez ALL) usuwa duplikaty — skutecznie wykonując a DISTINCT w sprawie wyniku końcowego;
  • UNION ALL również przechowuje duplikaty i jest znacznie szybszy z tego powodu pozwala uniknąć sortowania/hashowania w celu deduplikacji.
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;

PRZECIĘCIE i WYJĄTEK

INTERSECT przechowuje tylko wiersze obecne w obu wynikach; KODEF1 zachowuje wiersze pierwszego, których nie ma w drugim (zestaw „różnica”).

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 i EXCEPT również domyślnie usuwają duplikaty; the Warianty INTERSECT ALL / EXCEPT ALL tego nie robią.

Spróbuj sam

Ćwiczenie#sql.m5.l4.e1
Próby: 0Ładowanie...

Trova tutte le e-mail dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). Una Colonna: e-mail. Ordina na e-mail.

Ładowanie edytora...
Pokaż wskazówkę

UNION między dwoma SELECTami zwracającymi tę samą kolumnę e-mail. ORDER BY pojawia się na końcu, na wyniku końcowym.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#sql.m5.l4.e2
Próby: 0Ładowanie...

Trova le e-mail dei che hanno ordinato ma non hanno mai recensito nulla. USA Z WYJĄTKIEM. Una Colonna: e-mail. Ordina na e-mail.

Ładowanie edytora...
Pokaż wskazówkę

EXCEPT zachowuje tylko wiersze z lewego SELECT, których nie ma w prawym.

Rozwiązanie dostępne po 3 próbach