Tous les outils
Gratuit

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

9
SELECT * FROM a INNER JOIN b ON a.id = b.a_id;
Only rows with a match in BOTH tables
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id;
All left rows, NULLs where no match
SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id;
All right rows, NULLs where no match
SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;
All rows from both, NULLs if unmatched
JOIN = INNER JOIN
Plain JOIN defaults to INNER
LEFT OUTER JOIN = LEFT JOIN
The OUTER keyword is optional
LEFT JOIN ... UNION ... RIGHT JOIN ...
Emulate FULL JOIN in MySQL (none native)
ON a.id = b.a_id AND a.type = b.type
Compound (multi-column) join condition
ON a.qty BETWEEN p.min_qty AND p.max_qty
Non-equi join: match on a range

Anti-joins (no match)

8
LEFT JOIN b ON a.id = b.a_id WHERE b.a_id IS NULL
Left rows with NO match on the right
WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
Anti-join; safe with NULLs
WHERE a.id NOT IN (SELECT a_id FROM b)
One NULL in the list = empty result!
WHERE a.id NOT IN (SELECT a_id FROM b WHERE a_id IS NOT NULL)
NOT IN made NULL-safe
RIGHT JOIN a ... WHERE a.id IS NULL
Right rows with no match on the left
SELECT id FROM a EXCEPT SELECT a_id FROM b;
Set difference (Postgres, MySQL 8.0.31+)
users without orders = LEFT JOIN + IS NULL
The classic anti-join use case
Prefer NOT EXISTS over NOT IN
Same plan, none of the NULL traps

Semi-joins (has a match)

8
WHERE EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id)
Left rows having a match; never duplicates
WHERE a.id IN (SELECT a_id FROM b)
Same intent; fine for short value lists
JOIN b ... GROUP BY a.id
JOIN duplicates 1-to-many; dedupe needed
SELECT DISTINCT a.* FROM a JOIN b ON ...
Semi-join via JOIN; EXISTS is cleaner
EXISTS stops at the first match
Often faster than joining everything
EXISTS (SELECT 1 ...) vs (SELECT * ...)
Selected columns are ignored; 1 is idiomatic
IN: uncorrelated / EXISTS: correlated
Optimizers usually rewrite them the same
users WITH orders = EXISTS subquery
The classic semi-join use case

Self joins

8
FROM emp e JOIN emp m ON e.manager_id = m.id
Each employee paired with their manager
FROM emp e LEFT JOIN emp m ON e.manager_id = m.id
Keeps top-level rows (manager is NULL)
SELECT e.name, m.name AS manager FROM ...
Aliases are REQUIRED to tell copies apart
ON a.id < b.id
Unique pairs: no self-match, no mirrors
ON a.id <> b.id
All ordered pairs except self-matches
ON b.day = a.day + INTERVAL 1 DAY
Adjacent rows (gaps and islands)
ON a.city = b.city AND a.id <> b.id
Other rows sharing the same value
WITH RECURSIVE tree AS (... UNION ALL ...)
Whole hierarchy: recursive CTE, not a join

Cross & multi-table joins

8
SELECT * FROM sizes CROSS JOIN colors;
Every combination: m x n rows, no ON
FROM sizes, colors
Implicit cross join; avoid this syntax
FROM users u JOIN orders o ON ... JOIN items i ON ...
Chain joins; each needs its own ON
JOIN dates d CROSS JOIN users u LEFT JOIN ...
Calendar x users grid, then fill data
u LEFT JOIN o ON ... LEFT JOIN i ON i.o_id = o.id
Keep LEFT down the chain to keep all users
u LEFT JOIN o ... INNER JOIN i ON i.o_id = o.id
INNER after LEFT drops the NULL rows!
FROM a JOIN (b LEFT JOIN c ON ...) ON ...
Parentheses control join grouping
Written order is logical, not execution order
The optimizer reorders inner joins freely

ON vs WHERE (the gotcha)

8
LEFT JOIN b ON a.id = b.a_id AND b.status = 1
Filters RIGHT side; all left rows kept
LEFT JOIN b ON a.id = b.a_id WHERE b.status = 1
NULL fails the test: LEFT becomes INNER!
WHERE b.a_id IS NULL OR b.status = 1
Keep unmatched rows despite a WHERE filter
LEFT JOIN b ON ... AND a.type = 'x'
Left-side filter in ON does NOT drop rows
WHERE a.type = 'x'
Filter the LEFT table in WHERE instead
INNER JOIN: ON and WHERE are equivalent
The trap only exists for outer joins
COALESCE(b.total, 0)
Replace outer-join NULLs with a default
COUNT(b.id) vs COUNT(*)
COUNT(col) skips NULLs: 0 for no match

USING, NATURAL & set ops

9
JOIN b USING (user_id)
Equi-join on a same-named column
USING outputs ONE shared column
ON keeps both a.user_id and b.user_id
NATURAL JOIN b
Auto-joins ALL same-named columns; fragile
Avoid NATURAL JOIN in production
A new column silently changes the join
SELECT ... UNION SELECT ...
Stack rows vertically, duplicates removed
UNION ALL
Keep duplicates; much faster than UNION
JOIN adds columns, UNION adds rows
Widen vs lengthen the result set
INTERSECT
Rows present in both result sets
UNION needs same column count and types
Names come from the first SELECT

LATERAL & performance

9
CROSS JOIN LATERAL (SELECT ... WHERE b.a_id = a.id LIMIT 3) t
Per-row subquery: top-N per group
LEFT JOIN LATERAL (...) t ON TRUE
Keep left rows whose subquery is empty
CROSS APPLY / OUTER APPLY
SQL Server spelling of LATERAL joins
LATERAL sees columns of preceding tables
A plain subquery in FROM cannot
CREATE INDEX idx ON orders (user_id);
Index the FK side of every frequent join
EXPLAIN SELECT ...;
Check join order, type, and index usage
Filter early: join the smallest set first
Less rows carried through each join
ON DATE(a.created_at) = b.day
Function on a column kills index use
Join on same-type, same-collation columns
Implicit casts also disable indexes

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

  1. Ouvrez la fiche et passez en revue les sections, des Types de jointures de base à LATERAL et performance.
  2. Recherchez un mot-clé comme LEFT JOIN, EXISTS ou NOT IN pour filtrer chaque ligne en direct.
  3. Lisez la section ON vs WHERE avant de déboguer un LEFT JOIN qui renvoie trop peu de lignes.
  4. Cliquez sur une instruction ou son icône de copie pour copier le SQL dans votre presse-papiers.
  5. Utilisez Imprimer pour une copie papier de la référence complète des jointures.

Questions fréquentes

Les jointures inner, left, right et full outer, plus les anti-jointures, les semi-jointures, les self joins, les jointures croisées, les jointures multi-tables, les jointures USING et NATURAL, la famille UNION des opérations d'ensemble, et les jointures LATERAL.

Une condition dans ON filtre la table jointe avant que la jointure externe ne conserve les lignes sans correspondance ; la même condition dans WHERE s'exécute ensuite et écarte les lignes NULL, transformant le LEFT JOIN en INNER JOIN. La fiche a une section sur exactement cela.

La section anti-jointure montre les motifs LEFT JOIN … WHERE droite.id IS NULL et NOT EXISTS, et explique pourquoi NOT IN se comporte mal quand la sous-requête peut renvoyer NULL.

Oui. La syntaxe est du SQL standard et fonctionne dans MySQL, PostgreSQL, SQL Server et SQLite, avec les quelques notes propres à chaque moteur signalées sur la ligne elle-même.

Oui, elle est entièrement gratuite et s'exécute dans votre navigateur sans connexion.


Recherches populaires
sql joins cheat sheet types de jointures sql inner join vs left join anti join sql full outer join sql exemple de self join on vs where dans les jointures
Besoin d'aide ?
Un problème avec cet outil ? Signalez-le à notre équipe.
Signaler un problème

Ajoutez cet outil gratuit à votre propre site web — copiez-collez le code ci-dessous.