Tipurile de JOIN din SQL, comparate: inner, outer, cross, self, lateral, natural — ce returnează fiecare, cu un exemplu pe un rând.
Join-urile combină rânduri din două tabele pe baza unei chei comune. Tipul de join decide ce rânduri supraviețuiesc când cheile se potrivesc, lipsesc sau se repetă.
Tabel de referință · 8 intrări
Join-uri SQLExplained
8 of 8 rows
Inner și outer
Doar rândurile în care condiția ON se potrivește în ambele tabele. Rândurile fără pereche de pe oricare parte sunt eliminate.
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Toate rândurile din tabelul din stânga. Coloanele din dreapta sunt NULL acolo unde nu există potrivire.
SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Toate rândurile din tabelul din dreapta. Coloanele din stânga sunt NULL acolo unde nu există potrivire.
SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Toate rândurile din ambele tabele. Părțile fără pereche sunt completate cu NULL.
SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross și self
Produs cartezian. Fiecare rând din stânga se asociază cu fiecare rând din dreapta. Fără clauză ON.
SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Un tabel unit cu el însuși prin aliasuri. Compară rânduri dintr-un singur tabel.
SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
Avansat
O subinterogare în FROM, evaluată pentru fiecare rând exterior. Subinterogarea poate referi coloanele tabelului exterior.
SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Unește pe coloanele care au același nume. Fără clauză ON. Atenție la coliziuni de chei nedorite.
SELECT u.name, o.total FROM users u NATURAL JOIN orders o;