Retour à la liste des articles Articles
8 minutes de lecture

Qu'est-ce que le OUTER JOIN en SQL ?

Même si vous êtes novice en SQL, vous avez forcément rencontré le terme OUTER JOIN. Dans cet article, je vais vous expliquer ce que fait OUTER JOIN en SQL. Je m'appuierai sur quelques exemples pratiques pour montrer comment il est utilisé dans les applications SQL quotidiennes.

Si vous voulez utiliser SQL à des fins pratiques, il est extrêmement important d'apprendre les différents JOINs. En fait, vous utiliserez un JOIN dans à peu près une requête sur deux que vous écrirez. Il est donc impératif que vous fassiez un effort pour vous familiariser avec elles.

Bien que cet article contienne quelques informations de base sur JOIN en général et OUTER JOIN en particulier, je recommande aux apprenants sérieux de suivre le Les jointures en SQL cours de LearnSQL.fr. Il s'agit d'un groupe interactif de 93 exercices pratiques répartis sur 5 sections, et il vous permettra d'acquérir une compréhension approfondie des JOIN SQL.

Ceci étant dit, plongeons directement dans le sujet, en commençant par ce que fait un SQL JOIN.

Qu'est-ce qu'une JOIN ?

Une jointure SQL JOIN est utilisée pour combiner les données de deux ou plusieurs tables et générer un seul tableau de sortie contenant des colonnes sélectionnées dans les deux tables. Vous utiliserez généralement une ou plusieurs valeurs communes dans les tables pour les lier. Vous spécifiez comment combiner les lignes de deux tables dans la condition JOIN: les lignes des deux tables qui satisfont à la condition sont combinées et ajoutées à la table de résultat.

Par exemple, disons que vous avez une base de données contenant des informations sur les clients. Lorsqu'un client s'inscrit auprès de votre entreprise, vous enregistrez ses coordonnées (Customer_Number, Customer_Name, Age, Postal_Code, et Address) dans une table appelée customers. Les détails des commandes passées par le client sont stockés dans une autre table appelée . ordersqui contient les adresses Order_Number, Order_Date, Expected_Shipping_Date, et Customer_Number.

Imaginez qu'un client passe une commande et que vous ayez besoin de connaître son adresse de livraison. Cependant, la table orders ne contient que l'adresse Customer_Number. Pour récupérer l'adresse du client, vous devez consulter les tables JOIN et . customers et orders sur la base de Customer_Number.

Dans ce cas, Customer_Number sert de valeur de colonne à comparer.

customers:

Customer_NumberCustomer_NameAgePostal_CodeAddress
103Atelier274400054, RueRoyal
112Signal32830308489 Strong
114Collector273004636 Kilda
119La Roche274400067, rue chimay
121Baane mini324110Ering Shakkes

orders:

Order_NumberOrder_DateExpected_Shipping_DateCustomer_Number
1034531-01-202210-02-2022103
1034630-01-202215-02-2022112
1012005-02-202216-02-2022114
1032506-02-202210-02-2022121
1121108-02-202221-02-20224110

Voici la requête que vous utiliseriez pour relier tous les numéros de commande aux noms et adresses des clients :

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code, 
  b.Address 
FROM orders a 
JOIN customers b  
ON a.Customer_Number = b.Customer_Number;

Et voici le résultat :

Order_NumberCustomer_NamePostal_CodeAddress
10345Atelier4400054, RueRoyal
10346Signal830308489 Strong
10120Collectors3004636 Kilda
10325Baane Mini4110Ering Shakkes

Dans cette requête, SQL sélectionne les colonnes Order_Number dans la table orders et Customer_Name, Postal_Code, et Address dans la table customers. Customer_Number est la colonne utilisée dans la condition JOIN. Pour chaque commande, le numéro de client correspondant de orders est comparé au numéro de client dans la table customers table. Le nom, le code postal et l'adresse du client sont récupérés pour cette commande.

Il s'agit d'un exemple classique de INNER JOIN (également connu sous le nom de plain ou regular JOIN ; le mot-clé INNER est facultatif). C'est l'un des sites JOINs les plus utilisés en SQL. INNER JOIN signifie essentiellement que seules les lignes dont les valeurs sont communes aux deux tables seront récupérées. Remarquez que les lignes comportant le numéro de client 119 (qui n'a pas de commande correspondante) et le numéro de commande 11211 (qui n'a pas de numéro de client correspondant) ne sont pas incluses dans le résultat.

Cependant, INNER JOIN n'est pas le seul JOIN que SQL propose. Il existe plusieurs types de OUTER JOIN que vous devez connaître.

Les OUTER JOINS expliqués

En SQL, JOINs est classé dans les catégories suivantes :

  1. INNER JOIN - Renvoie uniquement les lignes dont les valeurs correspondent à la condition JOIN dans les deux tables. Les lignes de l'une ou l'autre table qui ne correspondent pas à cette condition sont ignorées.
  2. OUTER JOIN
    1. LEFT JOIN - Renvoie toutes les lignes de la table de gauche (la table avant le mot-clé JOIN ). Pour les lignes qui ont une correspondance dans la table de droite, il renvoie les valeurs de la table de droite ; pour les lignes sans correspondance dans la table de droite, il remplit les valeurs manquantes avec NULLs.
    2. RIGHT JOIN - Renvoie toutes les lignes de la table de droite (la table après le mot-clé JOIN ). Pour les lignes qui ont une correspondance dans la table de gauche, il renvoie les valeurs de la table de gauche ; pour les lignes sans correspondance dans la table de gauche, il remplit les valeurs manquantes avec NULLs.
    3. FULL JOIN - Renvoie toutes les lignes des deux tables, en utilisant NULLs pour les valeurs sans correspondance.

Pour tout JOIN, la structure de base de la requête SQL est la suivante :

<SELECT <list of columns>
FROM <table 1> 
LEFT/RIGHT/FULL/INNER JOIN <table 2> 
ON <join condition>
WHERE <other conditions>;

Remarque : au lieu du mot clé LEFT JOIN, vous pouvez utiliser LEFT OUTER JOIN. Le mot-clé OUTER est facultatif. De même, vous pouvez utiliser RIGHT OUTER JOIN au lieu de RIGHT JOIN ainsi que FULL OUTER JOIN au lieu de FULL JOIN sans que les résultats de la requête ne changent.

OUTER JOIN est utilisé pour récupérer tous les enregistrements des tables, même ceux qui n'ont pas de valeur correspondante dans l'autre table selon la condition JOIN. Dans ce cas, elle renvoie NULL comme valeur pour les colonnes manquantes.

OUTER JOIN est utilisé pour récupérer tous les enregistrements des tables, même ceux qui n'ont pas de valeur correspondante dans l'autre table en fonction de la condition JOIN. Dans ce cas, elle renvoie NULL comme valeur pour les colonnes manquantes.

Comme nous l'avons mentionné précédemment, il existe trois types de OUTER JOIN: LEFT OUTER JOIN, RIGHT OUTER JOIN et FULL OUTER JOIN. Laissez-moi vous donner quelques exemples pour vous montrer comment ils fonctionnent.

JOINTURE EXTERNE GAUCHE

Imaginez que vous ayez besoin de récupérer toutes les commandes avec les informations sur les clients. Mais vous devez également inclure les commandes qui ne contiennent pas d'informations sur le client. Dans ce cas, vous pouvez utiliser une LEFT OUTER JOIN.

Requête :


SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
LEFT JOIN customers b -- alternatively use LEFT OUTER JOIN instead of LEFT JOIN
ON a.Customer_Number = b.Customer_Number;

Sortie :

Order_NumberCustomer_NamePostal_CodeAddress
10345Atelier4400054, RueRoyal
10346Signal830308489 Strong
10120Collectors3004636 Kilda
10325Baane Mini4110Ering Shakkes

Remarquez que, puisque vous avez spécifié "LEFT JOIN" dans la requête, celle-ci fonctionne en récupérant d'abord toutes les lignes de la table de gauche, puis la valeur correspondante dans la table de droite. La table de gauche est la table indiquée avant le mot-clé JOIN (ici, la table orders ). La requête renvoie NULL dans les colonnes de la table de droite (Customer_Name, Postal_Code) pour toutes les lignes pour lesquelles il n'y a pas de valeur Customer_Number correspondante dans la table customers. Notez que la commande numéro 11211 (la commande sans client attribué) a été incluse dans les résultats, avec des valeurs NULL dans les colonnes Customer_Name et Postal_Code.

JOINTURE EXTERNE DROITE

Une RIGHT OUTER JOIN fonctionne exactement à l'inverse d'une LEFT OUTER JOIN. Elle récupère toutes les lignes de la table de droite (la table indiquée après le mot-clé JOIN ) et les valeurs correspondantes de la table de gauche. Il y a NULLs pour toutes les lignes pour lesquelles la table de gauche n'a pas de correspondance. Voyons un exemple.

Requête :

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
RIGHT JOIN customers b -- alternatively use RIGHT OUTER JOIN instead of RIGHT JOIN
ON a.Customer_Number = b.Customer_Number;

Sortie :

Order_NumberCustomer_NamePostal_Code
10345Atelier44000
10346Signal83030
10120Collectors3004
10325Baane Mini4110
NULLLa Roche44000

Ici, le client (La Roche) qui n'a passé aucune commande figure dans les résultats de la requête ; la commande sans client a été omise. Ceci est dû au fait que nous avons utilisé un RIGHT OUTER JOIN; tous les enregistrements de la bonne table (customers) ont été inclus.

JOINTURE EXTERNE COMPLÈTE

Mais que faire si vous voulez toutes les lignes des deux tables ? Utilisez l'adresse FULL OUTER JOIN. Cette adresse JOIN renvoie toutes les lignes des deux tables, en substituant NULL à toute valeur de ligne qui n'est pas présente dans l'autre table.

Requête :

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
FULL JOIN customers b --alternatively use ‘FULL OUTER JOIN’ instead of ‘FULL JOIN’
ON a.Customer_Number = b.Customer_Number;

Sortie :

Les résultats incluent à la fois le client La Roche (qui n'a aucune commande) et la commande 11211 (qui n'a aucune information sur le client).

Différence entre INNER et OUTER JOIN

Comme vous l'avez peut-être compris, la principale différence entre INNER JOIN et OUTER JOIN consiste à inclure ou non les lignes pour lesquelles nous n'avons pas de correspondance dans l'autre table. Alors qu'un INNER JOIN ne renvoie que les lignes pour lesquelles il existe une correspondance entre les deux tables, un OUTER JOIN (selon le type) renvoie également les lignes pour lesquelles il n'existe aucune ligne correspondante dans l'autre table.

Prêt à utiliser OUTER JOIN dans vos requêtes ?

J'espère que cet article vous a donné une bonne idée de la façon d'utiliser OUTER JOIN. Si vous souhaitez approfondir l'utilisation de SQL JOINs, consultez la formation Les jointures en SQL dont j'ai parlé plus haut. Si vous commencez tout juste votre apprentissage de SQL, je vous recommande la piste Le SQL de A à Z piste. Il contient 7 cours SQL qui vous mènent du SQL de base au SQL avancé. Il est idéal pour acquérir des bases solides dans ce langage.

Quoi qu'il en soit, comme dans tout autre domaine, l'apprentissage continu est la clé du succès. Alors, bonne chance et bon apprentissage !