Lekcje modułu (3/4)
OUTER JOIN: znajdowanie "luk"
W module 3 widziałeś LEFT JOIN: zachowaj wszystkie wiersze po lewej stronie, nawet te
bez dopasowania po prawej stronie (które stają się NULL). W tym rozdziale my
rozszerz zestaw narzędzi o RIGHT JOIN i FULL OUTER JOIN, a będziemy się uczyć
jak ich używać, aby znaleźć „dziury” w danych: wiersze w jednej tabeli
nie mają odpowiednika w drugim.
Trzy rodzaje ŁĄCZENIA ZEWNĘTRZNEGO
A LEFT JOIN B ON … -- tutte le righe di A, con o senza match in B
A RIGHT JOIN B ON … -- tutte le righe di B, con o senza match in A
A FULL JOIN B ON … -- tutte le righe di A *e* di B; NULL dove non c'è matchA RIGHT JOIN B można zawsze przepisać na B LEFT JOIN A w ten sam sposób
ON: to kwestia czytelności. Wiele stylów (w tym ten kurs)
wolę zawsze używać LEFT JOIN dla spójności.
Wzorzec „anti-join”: znajdowanie brakujących
Najczęstszym zastosowaniem LEFT JOIN nie jest „wzbogacanie danych na temat
Right”, ale znajdź wiersze po lewej stronie, które NIE mają dopasowania w
prawda. Nazywa się to antyłączeniem:
-- Prodotti senza nessuna recensione:
SELECT p.id, p.name
FROM products p
LEFT JOIN reviews r ON r.product_id = p.id
WHERE r.id IS NULL
ORDER BY p.id;Logika wzorca:
LEFT JOINdołącza recenzje każdego produktu, jeśli takie istnieją;- w przypadku produktów bez recenzji wszystkie kolumny
rmają wartośćNULL; WHERE r.id IS NULLprzechowuje tylko te produkty.
Kontrola klucza: id IS NULL w kolumnie NOT NULL tabeli po prawej stronie
oznacza „nie było dopasowania”. Często filtrujesz według PK prawej ręki
stole właśnie z tego powodu.
PEŁNE POŁĄCZENIE ZEWNĘTRZNE
FULL OUTER JOIN utrzymuje obie strony bez dopasowania. Jest rzadko używany,
zazwyczaj do sprawdzania integralności danych:
SELECT c.id AS customer_id, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id
WHERE c.id IS NULL OR o.id IS NULL;Wiersze z c.id IS NULL byłyby zamówieniami osieroconymi (customer_id, który
nie istnieje w customers). Osoby z o.id IS NULL są klientami
bez rozkazów. W naszym zestawie danych klucze obce gwarantują, że nie ma sieroty
istnieją zamówienia; Pozostają tylko klienci bez zamówień.
Spróbuj sam
Trova tutti i prodotti che non hanno mai ricevuto una recensione. Nazwa Mostra solo la colonna. Ordina na imię.
Pokaż wskazówkę
Wzorzec zapobiegający łączeniu: LEFT JOIN recenzje su produkt_id, poi WHERE r.id IS NULL.
Rozwiązanie dostępne po 3 próbach
Przejrzyj ćwiczenie
Trova i clienti che non hanno mai ordinato nulla. Poczta Mostra. Ordina na e-mail.
Pokaż wskazówkę
Stesso wzór dell'esercizio precedente, ma dla klientów e zamówień.
Rozwiązanie dostępne po 3 próbach