Salt la conținutul principal
Modulul 5 · Lecția 3 din 419/57 în curs~10 min
Lecții din modul (3/4)

OUTER JOIN: găsirea „lacunelor”

În modulul 3 ați văzut LEFT JOIN: păstrați toate rândurile din stânga, chiar și acelea fără chibrit în dreapta (care devin NULL). În acest capitol noi extindeți setul de instrumente cu RIGHT JOIN și FULL OUTER JOIN și învățăm cum să le folosiți pentru a găsi „găurile” din date: rânduri dintr-un tabel care nu au corespondent în celălalt.

Cele trei tipuri de OUTER JOIN

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 poate fi întotdeauna rescris ca B LEFT JOIN A cu același ON: este o chestiune de lizibilitate. Multe stiluri (inclusiv acest curs) preferă să folosești întotdeauna LEFT JOIN pentru consecvență.

Modelul „anti-join”: găsirea celor lipsă

Cea mai frecventă utilizare a LEFT JOIN nu este „îmbogățirea cu datele de pe dreapta”, dar găsește rândurile din stânga care NU au o potrivire pe corect. Se numește anti-alăturare:

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;

Logica modelului:

  1. LEFT JOIN atașează recenziile fiecărui produs, dacă există;
  2. pentru produsele fără recenzii, toate coloanele r sunt NULL;
  3. WHERE r.id IS NULL păstrează doar acele produse.

Verificare cheie: un id IS NULL pe o coloană NOT NULL a tabelului din dreapta înseamnă "nu a fost nicio potrivire". Filtrezi adesea pe PK-ul mâinii drepte tabel tocmai din acest motiv.

UNIRE EXTERIOR COMPLET

FULL OUTER JOIN păstrează ambele părți fără un meci. Este rar folosit, de obicei, pentru verificările integrității datelor:

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;

Rândurile cu c.id IS NULL ar fi ordine orfane (un customer_id care nu există în customers). Cei cu o.id IS NULL sunt clienți fara ordine. Pe setul nostru de date, cheile externe garantează că nu există orfan comenzi exista; raman doar clientii fara comenzi.

Încercați-l singur

Exercițiu#sql.m5.l3.e1
Încercări: 0Se încarcă…

A găsit toate produsele care nu au mai primit o recenzie. Mostra solo la colonna nume. Ordina pe nume.

Se încarcă editorul...
Afișează indiciu

Model anti-aderare: LEFT JOIN recenzii pe product_id, poi WHERE r.id IS NULL.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m5.l3.e2
Încercări: 0Se încarcă…

Trova i clienti che non hanno mai ordinato nulla. Afișează e-mailul. Ordina pe e-mail.

Se încarcă editorul...
Afișează indiciu

Stesso pattern dell'esercizio precedent, ma fra clienții și comenzile.

Soluție disponibilă după 3 încercări