Types de jointures SQL : le petit guide !

Image mis en avant de l'article

Dans le langage SQL, il existe une notion simple en apparence, mais assez puissante pour manipuler des bases de données. Ce sont les jointures ! Il peut arriver que ce concept soit assez obscur pour les personnes qui ne sont pas des experts en SQL, surtout qu’il existe plusieurs types de jointures. Cet article va vous dévoiler la différence entre tous ces types ! C’est parti !

C’est quoi une jointure SQL déjà ?

Une jointure permet de créer une liaison entre deux ou plusieurs tables pour pouvoir récupérer un résultat bien précis.

Ce résultat est en quelque sorte une fusion virtuelle de plusieurs tables. Chaque entrée de chaque table est retournée dans le résultat en fonction de la jointure utilisée, ça peut vite faire beaucoup de lignes !

Là où les jointures sont puissantes, c’est que ces requêtes donnent la possibilité de regrouper deux ou plusieurs entrées sur une seule et même ligne lors du retour s’il y a une correspondance de valeurs entre des tables.

Les jointures permettent donc de travailler sur plusieurs tables en même temps dans une seule requête SQL. Elles permettent également d’éviter les répétitions de données et par la même occasion, d’optimiser la structure des tables. De plus, si une modification de donnée intervient sur une table, cela prendrait effet sur toutes les tables qui sont liées entre elles.

La jointure des tables se fait par des requêtes SQL, ce n’est donc pas lors de la création des tables qu’on les lie entre elles. La seule chose pour que les jointures fonctionnent correctement est d’avoir des valeurs uniques comme des identifiants sur chacun des tables à lier.

Les identifiants permettent de faciliter cette liaison. Lorsqu’une table donne la possibilité à ses entrées de stocker l’identifiant d’une autre table, cela permet en quelque sorte d’associer les deux lignes entre elles, même quand ce sont des tables différentes. Il est donc important que les tables aient chacun des numéros uniques pour chaque ligne, même si vous comptez ne pas faire de jointure. Les index sont parfaits pour ça !

À noter que je ne parlerai pas ici de CROSS JOIN, SELF JOIN ou de NATURAL JOIN. Ce sont des jointures un peu spéciales qui ne rentrent pas dans mes petits cercles :).

Les jointures c’est cool, mais il existe plusieurs types de jointures et il est facile de s’emmêler les pinceaux lorsqu’on commence à faire des requêtes SQL complexes avec des jointures en tout genre !

Les différents types de jointures SQL

Tout au long de l’article, je vais prendre l’exemple sur un site internet permettant à des auteurs d’écrire des articles, un peu comme WordPress. Ce site est composé deux tables MySQL :

  • La table T1 qui contient la liste des articles créée sur le site. La table T1 lors des requêtes SQL est considérée comme la table de gauche !
  • La table T2 qui contient la liste des auteurs. La table T2 est considérée comme la table de droite !

De plus, les lignes de la table T1 peuvent avoir l’identifiant d’une entrée de T2 dans une colonne nommée « auteur_id », ce qui signifie qu’un article a été écrit par un auteur. Si un article a été écrit par un auteur qui n’est pas enregistré dans la table T2, le champ « auteur_id » sera à NULL.

Inner Join

 Schéma Inner Join
 SELECT *
 FROM T1
 INNER JOIN T2
 ON T1.auteur_id = T2.id

La jointure la plus simple ! C’est une jointure dite interne. Ce type de jointure va retourner les entrées des deux tables si jamais une correspondance a été trouvée entre les deux tables.

Pour faire simple, si l’identifiant de T2 correspond à un identifiant stocké dans la table T1, alors les entrées des deux tables seront retournées sous la forme d’une seule entrée.

Dans notre exemple de WordPress, cela nous retournera toutes les informations d’un auteur tiré de la table T1 avec l’article qu’il a écrit. Si jamais un article n’a pas d’auteur, il ne sera pas dans le résultat.

Left Join

 Schéma Left Join
 SELECT *
 FROM T1
 LEFT JOIN T2
 ON T1.auteur_id = T2.id

LEFT JOIN est un autre type de jointure qu’on appelle une jointure externe. D’ailleurs, toutes les jointures autres que INNER JOIN sont des jointures externes.

LEFT JOIN va retourner le même résultat que l’INNER JOIN, mais il rajoute en plus toutes les entrées de T1 même si aucune correspondance n’a été trouvée dans T2.

Dans notre exemple, cela retournera tous les articles avec les informations de leurs auteurs, mais également les articles sans auteurs !

En fait, cela retourne toute la table T1 avec les informations T2 si une correspondance a été faite, sinon tous les champs de T2 seront mis à NULL.

La table qui est mise après le FROM est toujours considérée comme la table de gauche, du coup en utilisant le LEFT JOIN, c’est toute la table T1 qui est retournée !

Right Join

 Schéma Right Join
 SELECT *
 FROM T1
 RIGHT JOIN T2
 ON T1.auteur_id = T2.id

RIGHT JOIN fait la même chose que LEFT JOIN, seulement elle retourne toute la table T2 au lieu de T1 !

Dans notre exemple, cela retournera tous les articles avec les informations de leurs auteurs, mais également tous les auteurs qui n’ont pas écrit d’article !

Full Join

 Schéma Full Join
 SELECT *
 FROM T1
 FULL JOIN T2
 ON T1.auteur_id = T2.id

Si vous êtes malin, vous devez voir quel genre de résultat ça donne ! En gros, on prend INNER JOIN, LEFT JOIN et LEFT RIGHT, ont les mix ensemble et ça nous donne le FULL JOIN !

FULL JOIN retourne le même résultat que INNER JOIN, mais il rajoute en plus toutes les entrées de T2 dont aucune correspondance n’a été faite dans T1 et vice et versa.

Dans notre exemple, cela retournera toutes les correspondances entre un auteur et un article, les articles sans auteurs et les auteurs n’ayant pas écrit d’articles !

Le FULL JOIN n’est pas supporté par les serveurs MySQL, mais on peut tricher un peu en faisant une requête SQL complexe avec le LEFT JOIN, suivi d’un UNION et enfin d’un RIGHT JOIN.

Left Join (sans correspondance)

 Schéma Left Join sans correspondance
 SELECT *
 FROM T1
 LEFT JOIN T2
 ON T1.auteur_id = T2.id
 WHERE T1.auteur_id IS NULL

L’utilisation d’une condition WHERE devient nécessaire pour effectuer ce type de jointure. Cette requête va retourner seulement toutes les entrées de T1 qui n’ont aucune correspondance dans la table T2.

Dans notre exemple, cela va retourner tous les articles n’ayant pas d’auteurs. Les lignes de la liste qui sera retournée auront certains de leurs champs mis à NULL vu qu’on ne prend pas en compte les champs de T2.

Right Join (sans correspondance)

Schéma Right Join sans correspondance
 SELECT *
 FROM T1
 RIGHT JOIN T2
 ON T1.auteur_id = T2.id
 WHERE T1.auteur_id IS NULL

Cette requête va retourner seulement toutes les entrées de T2 qui n’ont aucune correspondance dans la table T1.

Dans notre exemple, cela va retourner seulement les auteurs n’ayant pas écrit d’articles !

Full Join (sans correspondance)

 Schéma Full Join sans correspondance
 SELECT *
 FROM T1
 FULL JOIN T2
 ON T1.auteur_id = T2.id
 WHERE T2.id IS NULL
 OR T1.auteur_id IS NULL

Retourne le même résultat de FULL JOIN, mais sans les correspondances entre les deux tables. C’est l’inverse de INNER JOIN !

Dans notre exemple, cela va retourner tous les articles n’ayant pas d’auteur ainsi que tous les auteurs n’ayant pas écrit un seul d’article.

Pour conclure !

  • Une jointure SQL permet de lier deux ou plusieurs tables entre elles.
  • La première table écrite dans la requête SQL est toujours considérée comme la table de gauche, les autres sont considérées comme les tables de droites.
  • INNER JOIN est une jointure interne, elle retourne les entrées qui ont une correspondance entre les deux tables en fonction de la valeur choisie après ON. Les autres jointures sont des jointures externes.
  • LEFT JOIN et RIGHT JOIN vont retourner les entrées qui ont une correspondance entre les deux tables, mais également toute la table qui est désignée (gauche ou droite). Les entrées qui n’ont pas trouvé de correspondance auront certains de leurs champs mis à NULL.
  • FULL JOIN retourne tout ! S’il n’y a pas de correspondance entre les deux tables pour une ligne, certains de ses champs seront mis à NULL.
  • Il est possible d’écarter les correspondances du résultat en ajoutant une condition dans la requête.
Partager l’article :
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

2 Commentaires

    • Salut, merci pour la petite précision.

      En effet pour le LEFT JOIN, une simple sélection sans jointure nous permet d’avoir le même résultat. Il y a quand même une subtilité entre les deux c’est que si on met une jointure comme dans l’exemple, le résultat nous retourne toutes les colonnes de T2 avec les champs mis à NULL. J’ai du mal à voir l’utilité de cette différence, mais elle existe ^^.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.