Cheat sheet JOIN SQL
Una referenza consultabile e stampabile sui join SQL: inner, left, right, full, anti e semi join, self join, ON vs WHERE e LATERAL. Gratis.
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
Nessuna voce corrisponde a “:q”.
Informazioni su Cheat sheet JOIN SQL
Questo cheat sheet sui join SQL fa una cosa in modo approfondito: spiega ogni modo di combinare le tabelle. Otto sezioni coprono i tipi di join di base, gli anti-join per righe senza corrispondenza, i semi-join per righe che hanno una corrispondenza, i self join, i join incrociati e multi-tabella, la classica trappola ON contro WHERE, USING, NATURAL e le operazioni insiemistiche, e i join LATERAL con note sulle prestazioni.
I join sono dove i risultati SQL vanno silenziosamente storti: un LEFT JOIN filtrato nella clausola WHERE diventa silenziosamente un INNER JOIN, e NOT IN con un NULL non restituisce nulla. Queste trappole hanno le proprie righe qui, accanto al pattern corretto da usare al loro posto.
Come ogni cheat sheet di questo gruppo è gratuito e lato client: filtra le righe dal vivo con la casella di ricerca, salta tra le sezioni con l'indice fisso, copia qualsiasi istruzione con un clic e stampa la pagina come riferimento sulla scrivania.
Come usare Cheat sheet JOIN SQL
- Apri il foglio e rivedi le sezioni, dai Tipi di join di base fino a LATERAL e prestazioni.
- Cerca una parola chiave come LEFT JOIN, EXISTS o NOT IN per filtrare ogni riga dal vivo.
- Leggi la sezione ON contro WHERE prima di fare debug di un LEFT JOIN che restituisce troppe poche righe.
- Fai clic su un'istruzione o sulla sua icona di copia per copiare l'SQL negli appunti.
- Usa Stampa per una copia cartacea dell'intero riferimento sui join.