SQL-joins-cheatsheet
Een doorzoekbaar, afdrukbaar naslagwerk voor SQL-joins: inner, left, right, full, anti- en semi-joins, self joins, ON versus WHERE en 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
Geen vermelding komt overeen met “:q”.
Over SQL-joins-cheatsheet
Dit SQL-joins-spiekbriefje doet één ding grondig: het legt elke manier uit om tabellen te combineren. Acht secties behandelen de basisjointypes, anti-joins voor rijen zonder overeenkomst, semi-joins voor rijen mét overeenkomst, self joins, cross joins en joins over meerdere tabellen, de klassieke valkuil ON versus WHERE, USING, NATURAL en de verzamelingsoperaties, en LATERAL-joins met prestatienotities.
Bij joins gaan SQL-resultaten ongemerkt mis: een LEFT JOIN die in de WHERE-clausule wordt gefilterd, wordt stilzwijgend een INNER JOIN, en NOT IN met een NULL geeft niets terug. Die valkuilen krijgen hier een eigen rij, naast het juiste patroon dat u in plaats daarvan gebruikt.
Net als elk spiekbriefje in deze groep is het gratis en werkt het aan de clientzijde: filter rijen direct met het zoekvak, spring tussen secties met de vastgepinde inhoudsopgave, kopieer elke instructie met één klik en print de pagina als naslagwerk voor op uw bureau.
Hoe gebruik je SQL-joins-cheatsheet
- Open het overzicht en bekijk de secties, van Basisjointypes tot LATERAL & prestaties.
- Zoek op een trefwoord zoals LEFT JOIN, EXISTS of NOT IN om alle rijen direct te filteren.
- Lees de sectie ON vs WHERE voordat u een LEFT JOIN debugt die te weinig rijen teruggeeft.
- Klik op een instructie of het kopieericoon om de SQL naar uw klembord te kopiëren.
- Gebruik Afdrukken voor een papieren exemplaar van het volledige joins-naslagwerk.