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
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 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:
-- 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:
LEFT JOINatașează recenziile fiecărui produs, dacă există;- pentru produsele fără recenzii, toate coloanele
rsuntNULL; WHERE r.id IS NULLpă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:
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
A găsit toate produsele care nu au mai primit o recenzie. Mostra solo la colonna nume. Ordina pe nume.
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
Trova i clienti che non hanno mai ordinato nulla. Afișează e-mailul. Ordina pe e-mail.
Afișează indiciu
Stesso pattern dell'esercizio precedent, ma fra clienții și comenzile.
Soluție disponibilă după 3 încercări