Aide-mémoire des jointures SQL
Une référence des jointures SQL consultable et imprimable — jointures inner, left, right, full, anti et semi, self joins, ON vs WHERE et 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
Aucune entrée ne correspond à « :q ».
À propos de Aide-mémoire des jointures SQL
Cet aide-mémoire des jointures SQL fait une chose en profondeur : il explique toutes les façons de combiner des tables. Huit sections couvrent les types de jointures de base, les anti-jointures pour les lignes sans correspondance, les semi-jointures pour les lignes qui en ont une, les self joins, les jointures croisées et multi-tables, le classique piège ON contre WHERE, USING, NATURAL et les opérations d'ensemble, et les jointures LATERAL avec des notes de performance.
Les jointures sont l'endroit où les résultats SQL tournent discrètement mal — un LEFT JOIN filtré dans la clause WHERE devient silencieusement un INNER JOIN, et NOT IN avec un NULL ne renvoie rien. Ces pièges ont ici leurs propres lignes, à côté du motif correct à utiliser à la place.
Comme chaque aide-mémoire de ce groupe, il est gratuit et côté client : filtrez les lignes en direct avec la barre de recherche, sautez entre les sections avec le sommaire épinglé, copiez n'importe quelle instruction d'un clic et imprimez la page comme référence sur votre bureau.
Comment utiliser Aide-mémoire des jointures SQL
- Ouvrez la fiche et passez en revue les sections, des Types de jointures de base à LATERAL et performance.
- Recherchez un mot-clé comme LEFT JOIN, EXISTS ou NOT IN pour filtrer chaque ligne en direct.
- Lisez la section ON vs WHERE avant de déboguer un LEFT JOIN qui renvoie trop peu de lignes.
- Cliquez sur une instruction ou son icône de copie pour copier le SQL dans votre presse-papiers.
- Utilisez Imprimer pour une copie papier de la référence complète des jointures.