Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 3 z 419/57 w kursie~10 min
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

SQL
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'è match

A 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:

SQL
-- 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:

  1. LEFT JOIN dołącza recenzje każdego produktu, jeśli takie istnieją;
  2. w przypadku produktów bez recenzji wszystkie kolumny r mają wartość NULL;
  3. WHERE r.id IS NULL przechowuje 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:

SQL
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

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

Trova tutti i prodotti che non hanno mai ricevuto una recensione. Nazwa Mostra solo la colonna. Ordina na imię.

Ładowanie edytora...
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

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

Trova i clienti che non hanno mai ordinato nulla. Poczta Mostra. Ordina na e-mail.

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

Stesso wzór dell'esercizio precedente, ma dla klientów e zamówień.

Rozwiązanie dostępne po 3 próbach