Jointure interne vs jointure externe : lignes conservées, NULL, jointures gauche et droite, syntaxe SQL
Une jointure combine les lignes de deux tables selon la condition donnée dans ON (le plus souvent l’égalité d’une clé étrangère et d’une clé primaire) pour produire une seule table de résultat. Une jointure interne ne conserve que les combinaisons de lignes qui ont un partenaire correspondant ; les lignes sans partenaire disparaissent, dans les deux tables. Une jointure externe conserve les combinaisons correspondantes et aussi les lignes de la table désignée même sans partenaire, en remplissant les colonnes de l’autre table avec NULL. Une jointure externe gauche (LEFT OUTER JOIN) conserve toutes les lignes de la table de gauche, une jointure externe droite (RIGHT OUTER JOIN) celles de la table de droite, et une jointure externe complète (FULL OUTER JOIN) celles des deux. On choisit selon que les lignes sans partenaire doivent ou non apparaître dans le résultat.
| Critère | Jointure interne (INNER JOIN) | Jointure externe (OUTER JOIN) |
|---|---|---|
| Lignes conservées dans le résultat | Seulement les combinaisons de lignes qui satisfont la condition de jointure | Les combinaisons correspondantes, plus les lignes sans partenaire de la table à conserver |
| Lignes sans correspondance | Éliminées du résultat, dans les deux tables | Chaque ligne de la table conservée reste une fois, avec les colonnes de l’autre table à NULL ; les lignes sans correspondance de l’autre table sont éliminées |
| Types | Un seul type ; INNER peut être omis et l’on écrit simplement JOIN | Trois types : gauche (LEFT), droite (RIGHT) et complète (FULL) ; OUTER peut être omis |
| Exemple SQL | SELECT … FROM employee INNER JOIN dept ON employee.dept_id = dept.dept_id | SELECT … FROM employee LEFT OUTER JOIN dept ON employee.dept_id = dept.dept_id |
| Exemple de nombre de lignes (4 employés, dont un avec un identifiant de service NULL ; 3 services, dont un sans employé) | 3 lignes : l’employé dont l’identifiant de service est NULL et le service sans employé n’apparaissent pas | 4 lignes avec une jointure externe gauche qui conserve la table des employés (l’employé à l’identifiant de service NULL reçoit un nom de service NULL) ; 5 lignes avec une jointure externe complète qui conserve les deux |
| Ordre des tables | Inverser gauche et droite donne les mêmes lignes (seul l’ordre des colonnes change) | Pour les jointures externes gauche et droite, la table écrite à gauche change le résultat ; A LEFT OUTER JOIN B renvoie les mêmes lignes que B RIGHT OUTER JOIN A |
| Conditions sur les colonnes de l’autre table | Même résultat qu’elles soient écrites dans ON ou dans la clause WHERE | Écrites dans la clause WHERE, les lignes remplies de NULL ne satisfont pas la condition et disparaissent, ce qui peut donner le même résultat qu’une jointure interne ; il faut les écrire dans ON pour conserver les lignes sans correspondance |
| Usages typiques | Lorsqu’on ne veut que les données présentes dans les deux tables (par exemple ajouter le nom du client aux commandes) | Lorsqu’il faut aussi lister les lignes sans correspondance (par exemple tous les employés, y compris ceux sans service), ou pour rechercher les lignes sans partenaire |
Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.