Fișă de referință JOIN-uri SQL
O referință căutabilă și printabilă pentru SQL joins: inner, left, right, full, anti și semi joins, self joins, ON vs WHERE și LATERAL. Gratuit.
Basic join types
9SELECT * FROM a INNER JOIN b ON a.id = b.a_id;
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id;
SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id;
SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;
JOIN = INNER JOIN
LEFT OUTER JOIN = LEFT JOIN
LEFT JOIN ... UNION ... RIGHT JOIN ...
ON a.id = b.a_id AND a.type = b.type
ON a.qty BETWEEN p.min_qty AND p.max_qty
Anti-joins (no match)
8LEFT JOIN b ON a.id = b.a_id WHERE b.a_id IS NULL
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
WHERE a.id NOT IN (SELECT a_id FROM b)
WHERE a.id NOT IN (SELECT a_id FROM b WHERE a_id IS NOT NULL)
RIGHT JOIN a ... WHERE a.id IS NULL
SELECT id FROM a EXCEPT SELECT a_id FROM b;
users without orders = LEFT JOIN + IS NULL
Prefer NOT EXISTS over NOT IN
Semi-joins (has a match)
8WHERE EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
WHERE a.id IN (SELECT a_id FROM b)
JOIN b ... GROUP BY a.id
SELECT DISTINCT a.* FROM a JOIN b ON ...
EXISTS stops at the first match
EXISTS (SELECT 1 ...) vs (SELECT * ...)
IN: uncorrelated / EXISTS: correlated
users WITH orders = EXISTS subquery
Self joins
8FROM emp e JOIN emp m ON e.manager_id = m.id
FROM emp e LEFT JOIN emp m ON e.manager_id = m.id
SELECT e.name, m.name AS manager FROM ...
ON a.id < b.id
ON a.id <> b.id
ON b.day = a.day + INTERVAL 1 DAY
ON a.city = b.city AND a.id <> b.id
WITH RECURSIVE tree AS (... UNION ALL ...)
Cross & multi-table joins
8SELECT * FROM sizes CROSS JOIN colors;
FROM sizes, colors
FROM users u JOIN orders o ON ... JOIN items i ON ...
JOIN dates d CROSS JOIN users u LEFT JOIN ...
u LEFT JOIN o ON ... LEFT JOIN i ON i.o_id = o.id
u LEFT JOIN o ... INNER JOIN i ON i.o_id = o.id
FROM a JOIN (b LEFT JOIN c ON ...) ON ...
Written order is logical, not execution order
ON vs WHERE (the gotcha)
8LEFT JOIN b ON a.id = b.a_id AND b.status = 1
LEFT JOIN b ON a.id = b.a_id WHERE b.status = 1
WHERE b.a_id IS NULL OR b.status = 1
LEFT JOIN b ON ... AND a.type = 'x'
WHERE a.type = 'x'
INNER JOIN: ON and WHERE are equivalent
COALESCE(b.total, 0)
COUNT(b.id) vs COUNT(*)
USING, NATURAL & set ops
9JOIN b USING (user_id)
USING outputs ONE shared column
NATURAL JOIN b
Avoid NATURAL JOIN in production
SELECT ... UNION SELECT ...
UNION ALL
JOIN adds columns, UNION adds rows
INTERSECT
UNION needs same column count and types
LATERAL & performance
9CROSS JOIN LATERAL (SELECT ... WHERE b.a_id = a.id LIMIT 3) t
LEFT JOIN LATERAL (...) t ON TRUE
CROSS APPLY / OUTER APPLY
LATERAL sees columns of preceding tables
CREATE INDEX idx ON orders (user_id);
EXPLAIN SELECT ...;
Filter early: join the smallest set first
ON DATE(a.created_at) = b.day
Join on same-type, same-collation columns
Nicio intrare nu corespunde cu „:q”.
Despre Fișă de referință JOIN-uri SQL
Această fișă de referință pentru SQL joins face un singur lucru temeinic: explică fiecare mod de a combina tabele. Opt secțiuni acoperă tipurile de bază de join, anti-joins pentru rânduri fără potrivire, semi-joins pentru rânduri care au o potrivire, self joins, cross joins și join-uri pe mai multe tabele, capcana clasică ON versus WHERE, USING, NATURAL și operațiile de mulțimi, și LATERAL joins cu note de performanță.
Join-urile sunt locul unde rezultatele SQL o iau pe tăcute pe o cale greșită: un LEFT JOIN filtrat în clauza WHERE devine silențios un INNER JOIN, iar NOT IN cu un NULL nu returnează nimic. Aceste capcane primesc propriile rânduri aici, alături de pattern-ul corect de folosit în schimb.
La fel ca fiecare fișă de referință din acest grup, este gratuită și client-side: filtrează rândurile live cu caseta de căutare, sari între secțiuni cu cuprinsul lipicios, copiază orice instrucțiune cu un singur clic și tipărește pagina ca referință de birou.
Cum să utilizați Fișă de referință JOIN-uri SQL
- Deschide fișa și analizează secțiunile, de la Tipuri de bază de join, până la LATERAL și performanță.
- Caută un cuvânt cheie precum LEFT JOIN, EXISTS sau NOT IN pentru a filtra fiecare rând live.
- Citește secțiunea ON vs WHERE înainte de a depana un LEFT JOIN care returnează prea puține rânduri.
- Dă clic pe o instrucțiune sau pe iconița ei de copiere pentru a copia SQL-ul în clipboard.
- Folosește Tipărire pentru o copie pe hârtie a referinței complete despre joins.