Exécutez chaque jointure SQL sur deux petites tables d'exemple directement dans votre navigateur et voyez quelles lignes restent, avec la syntaxe PostgreSQL pour les jointures INNER, LEFT, RIGHT, FULL, CROSS et self.
Une jointure combine les lignes de deux tables selon une condition, généralement des clés correspondantes. INNER JOIN ne garde que les lignes qui correspondent des deux côtés. LEFT JOIN garde toutes les lignes de la table de gauche et remplit les colonnes de droite manquantes avec NULL, RIGHT JOIN fait l'inverse, FULL JOIN garde les deux, et CROSS JOIN associe chaque ligne à chaque ligne.
Les lignes conservées par chaque jointure
Jointure
Lignes correspondantes
Lignes de gauche sans correspondance
Lignes de droite sans correspondance
INNER JOIN
Oui
Non
Non
LEFT JOIN
Oui
Oui, côté droit à NULL
Non
RIGHT JOIN
Oui
Non
Oui, côté gauche à NULL
FULL JOIN
Oui
Oui
Oui
CROSS JOIN
Toutes les paires, sans condition
Les diagrammes de Venn sont la façon habituelle d'enseigner les jointures, mais ils cachent ce qui pose vraiment problème : les lignes dupliquées et les NULL. Voici deux toutes petites tables, clients et commandes, avec un client qui n'a jamais commandé et une commande dont le client a été supprimé. Choisissez une jointure et le résultat est calculé dans votre navigateur, pour voir exactement quelles lignes apparaissent et pourquoi.
Lisez les deux tables d'exemple. Ana a deux commandes, Ben en a une, Cleo n'en a aucune, et la commande 104 pointe vers un identifiant client qui n'existe pas.
Choisissez un type de jointure. La requête et la table de résultat se mettent à jour immédiatement.
Les lignes complétées par NULL sont mises en évidence, pour voir où les jointures externes ont ajouté des lignes.
Copiez la requête et essayez-la dans n'importe quelle base PostgreSQL avec le script de préparation plus bas.
Placez les conditions sur la table de droite d'un LEFT JOIN dans la clause ON, pas dans WHERE. Un filtre WHERE sur ces colonnes élimine les lignes NULL et la transforme discrètement en jointure interne.
Pour trouver les lignes sans correspondance, faites un LEFT JOIN puis filtrez avec WHERE right_table.id IS NULL.
Comptez les lignes avant et après une jointure. Si le nombre augmente de façon inattendue, la clé de jointure n'est pas unique d'un côté.
Préférez USING (column) ou un ON explicite à NATURAL JOIN, qui se met à faire correspondre en silence toute nouvelle colonne portant le même nom.
Questions fréquentes
Quelle est la différence entre INNER JOIN et LEFT JOIN ?
INNER JOIN supprime les lignes sans correspondance. LEFT JOIN garde toutes les lignes de la première table et met NULL dans les colonnes de la seconde quand rien ne correspond. Dans la démo, Cleo apparaît dans le LEFT JOIN avec une commande vide et manque dans l'INNER JOIN.
JOIN est-il identique à INNER JOIN ?
Oui. Dans PostgreSQL, le mot INNER est facultatif et un JOIN seul est une jointure interne. Le mot OUTER est aussi facultatif, donc LEFT JOIN et LEFT OUTER JOIN signifient la même chose.
Pourquoi ma jointure renvoie-t-elle plus de lignes que la table n'en contient ?
Chaque ligne de gauche apparaît une fois par ligne de droite correspondante. Un client avec trois commandes apparaît trois fois. C'est le comportement normal : agrégez avec GROUP BY ou joignez une sous-requête déjà groupée si vous voulez une ligne par client.
Qu'est-ce qu'une self join ?
Une table jointe à elle-même sous deux alias, utilisée quand des lignes pointent vers d'autres lignes de la même table, comme des employés et leurs responsables ou des clients et la personne qui les a parrainés.
MySQL prend-il en charge FULL OUTER JOIN ?
PostgreSQL oui, et c'est la syntaxe montrée ici. MySQL n'a pas de mot-clé FULL JOIN : le contournement habituel combine un LEFT JOIN et un RIGHT JOIN avec UNION.
ON, USING et NATURAL
ON accepte n'importe quelle condition, donc il gère des noms de colonnes différents et des règles supplémentaires comme une plage de dates. USING (customer_id) est un raccourci quand les deux tables nomment la colonne de la même façon, et il renvoie cette colonne une fois au lieu de deux.
Dans PostgreSQL, FROM a, b équivaut à un CROSS JOIN, et une clause WHERE le transforme en jointure interne. La syntaxe JOIN explicite est plus claire et a une priorité plus forte quand vous mélangez les deux styles.
Les filtres des jointures externes s'appliquent dans un autre ordre
Les conditions dans ON s'appliquent pendant la mise en correspondance des lignes, avant tout ajout de NULL. Les conditions dans WHERE s'exécutent sur le résultat final. Pour les jointures internes, les deux donnent la même réponse, mais pour les jointures externes elles peuvent donner des résultats très différents.
Essayez dans PostgreSQL
Collez ceci dans psql ou dans n'importe quel éditeur SQL Postgres pour recréer les tables d'exemple, puis lancez les requêtes de la démo.
Tables d'exemple
La commande 104 pointe volontairement vers le client 9, qui n'existe pas, pour que les jointures externes aient quelque chose à montrer.
Clients qui n'ont jamais commandé
Le LEFT JOIN garde Cleo avec des colonnes de commande à NULL, et le filtre IS NULL ne garde que ces lignes.
Bac à sable des jointures
Tables d'exemple utilisées dans la démo
Type de jointure
Résultat : {n} lignes
Les cellules mises en évidence ont été complétées par NULL par la jointure externe.