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.
-- 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:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';Zasady:
- dwa
SELECTmuszą mieć tę samą liczbę kolumn i być kompatybilne typy; UNION(bezALL) usuwa duplikaty — skutecznie wykonując aDISTINCTw sprawie wyniku końcowego;UNION ALLrównież przechowuje duplikaty i jest znacznie szybszy z tego powodu pozwala uniknąć sortowania/hashowania w celu deduplikacji.
-- 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”).
-- 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
Trova tutte le e-mail dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). Una Colonna: e-mail. Ordina na e-mail.
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
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.
Pokaż wskazówkę
EXCEPT zachowuje tylko wiersze z lewego SELECT, których nie ma w prawym.
Rozwiązanie dostępne po 3 próbach