Un SQL JOIN est une requête qui relie plusieurs tables d’une base de données re­la­tion­nelle et émet leurs données (les tuples) de manière filtrée selon une condition de sélection définie par l’uti­li­sa­teur.

Nom de domaine
Votre domaine en un clic
  • 1 cer­ti­fi­cat SSL Wildcard par contrat
  • Fonction incluse Domain Connect pour une con­fi­gu­ra­tion DNS sim­pli­fiée

Le type de JOIN le plus courant du modèle de base de données re­la­tion­nelle est le SQL INNER JOIN. Dans la pratique, les uti­li­sa­teurs utilisent INNER JOINs, par exemple, si deux tables de base de données doivent être reliées en utilisant les mêmes colonnes. Chaque en­re­gis­tre­ment de données d’une table est fusionné avec un en­re­gis­tre­ment de données cor­res­pon­dant de l’autre table. Les en­re­gis­tre­ments de données pour lesquels le système de gestion de base de données (SGBD) ne trouve pas de cor­res­pon­dance dans l’autre table sont masqués.

Un SQL OUTER JOIN, d’autre part, édite non seulement les en­re­gis­tre­ments de données des deux tables qui rem­plis­sent la condition de sélection (par exemple, l’égalité des valeurs de deux colonnes), mais aussi tous les autres tuples de l’une ou l’autre table.

En fonction du sens de lecture de la syntaxe SQL, on parle de table gauche ou table droite. Les opé­ra­tions res­pec­tives sont donc appelées LEFT OUTER JOIN et RIGHT OUTER JOIN. Si, en plus des en­re­gis­tre­ments de données qui rem­plis­sent la condition de sélection, vous voulez également éditer tous les en­re­gis­tre­ments de données de la table gauche et droite dans les requêtes de base de données, il s’agit d’un FULL OUTER JOIN.

Le principe des dif­fé­rents types de JOIN peut être très bien illustré par les schémas suivants :

Sous-types de OUTER JOINs

Chaque OUTER JOIN est réalisé comme LEFT OUTER JOIN, RIGHT OUTER JOIN ou FULL OUTER JOIN.

Conseil

Le mot-clé OUTER est fa­cul­ta­tif dans la syntaxe SQL. En règle générale, les uti­li­sa­teurs écrivent di­rec­te­ment LEFT JOIN, RIGHT JOIN et FULL JOIN.

Nous il­lus­trons la fonc­tion­na­lité des OUTER JOINs à l’aide des tables de base de données "salaries" et "car".

Table : salaries

e_id nom prenom car_id
1 Dupond Jacques 3
2 Martin Jean 1
3 Petit Hélène 1
4 Lefevre Lisa 2
5 Barthes Baptiste NULL

Le tableau "salaries" contient les nom et prénom des employés d’une en­tre­prise fictive ainsi que l’ID de la voiture de fonction affectée (car_id). La clé primaire de la table est un iden­ti­fiant pour l’employé (e_id). Le salarié avec l’ID 5 (Baptiste Barthes) n’a pas encore été affecté à un véhicule de fonction. La cellule de la colonne cor­res­pon­dante contient donc une valeur nulle.

Note

La valeur NULL est une valeur re­pré­sen­tant l’absence de valeur. Elle ne cor­res­pond pas à la valeur numérique 0.

Table : car

car_id marque modele im­ma­tri­cu­la­tion cons­truc­tion region
1 VW Caddy B KH 778 2016 75
2 Opel Astra B PO 654 2010 41
3 BMW X6 B MW 780 2017 37
4 Porsche Boxster B AA 123 2018 36

Les in­for­ma­tions sur le parc de véhicules de l’en­tre­prise ont été en­re­gis­trées dans le tableau "car" : la marque de la voiture, le modèle, le numéro d’im­ma­tri­cu­la­tion, l’année de cons­truc­tion et le numéro de dé­par­te­ment. Un ID cohérent (car_id) est attribué à chaque voiture de fonction, ce qui sert de clé primaire à la table.

Les deux tables sont liées par une relation de clé étrangère. La clé primaire de la table "car" (car_id) a été intégrée comme clé étrangère dans la table "salaries". Cela nous permet de relier les deux tables via une colonne commune.

Note

Même si les clés primaires valides ne doivent pas contenir de valeurs nulles, les valeurs nulles dans les clés étran­gères ne violent pas l’intégrité d’un ensemble de données.

SQL LEFT OUTER JOIN

Avec le LEFT OUTER JOIN, la table du côté gauche de l’opérateur JOIN est la table dominante. Dans l’algèbre re­la­tion­nelle, les LEFT OUTER JOINs sont notés avec l’opérateur suivant : .

Pour relier les tables "salaries" et "car" dans un LEFT OUTER JOINs, vous pouvez utiliser l’opération suivante :

salaries ⟕ car_id=car_idcar

L’in­te­rac­tion avec le SGBD se fait dans le langage SQL de la base de données. La formule ci-dessus cor­res­pond à l’ins­truc­tion SQL suivante :

SELECT * FROM salaries LEFT JOIN car ON salaries.car_id = car.car_id;

La table "salaries" se trouve sur le côté gauche de l’opérateur JOIN, la table "car" sur le côté droit. Nous dé­fi­nis­sons salaries.car_id = car.car_id comme condition de sélection. L’ensemble de résultats d’une LEFT OUTER JOIN comprend toutes les entrées de la table de gauche ainsi que les en­re­gis­tre­ments de données de la table de droite qui rem­plis­sent la condition JOIN. Seules les données de la table "car" qui con­tien­nent une valeur dans la colonne car_id et pour laquelle le SGBD trouve également une valeur cor­res­pon­dante dans la table "salaries" sont donc incluses dans l’ensemble de résultats du JOIN.

Les valeurs man­quantes dans le tableau de résultats sont éditées comme valeurs nulles.

Note

Con­trai­re­ment aux INNER JOIN, l’ordre des tables dans l’ins­truc­tion SQL doit être respecté pour les OUTER JOINs. Avec un LEFT JOIN, tous les en­re­gis­tre­ments de données de la table de gauche de l’opérateur JOIN sont com­plè­te­ment édités, avec un RIGHT JOIN, ce sont tous les en­re­gis­tre­ments de données de la table de droite de l’opérateur JOIN.

Voici le résultat du LEFT OUTER JOINs :

Table : LEFT OUTER JOIN sur les tables « salaries » et « car »

e_id nom prenom salaries.car_id car.car_id marque modele im­ma­tri­cu­la­tion cons­truc­tion region
1 Dupond Jacques 3 3 BMW X6 B MW 780 2017 37
2 Martin Jean 1 1 VW Caddy B KH 778 2016 75
3 Petit Hélène 1 1 VW Caddy B KH 778 2016 75
4 Lefevre Lisa 2 2 Opel Astra B PO 654 2010 41
5 Barthes Baptiste NULL NULL NULL NULL NULL NULL NULL

Le tableau des résultats présente deux par­ti­cu­la­ri­tés :

L’entrée de la table "car" car_id 4 (la Porsche Boxster) n’apparaît pas dans les résultats. Il n’y a en effet pas de clé étrangère ap­pro­priée dans le tableau "salaries" pour une clé primaire ayant la valeur 4 ; la condition de sélection n’est pas remplie. L’entrée provient de la table de droite et est donc masquée.

La clé étrangère car_id de la table "salaries" contient une valeur NULL pour l’en­re­gis­tre­ment du salarié Baptiste Barthes. Par con­sé­quent, aucune clé primaire cor­res­pon­dante ne se trouve dans le tableau "car". La condition de sélection n’est pas non plus remplie ici. Toutefois, comme l’en­re­gis­tre­ment de données provient de la table d’édition de gauche, il est gardé dans la table des résultats du LEFT JOIN. Les valeurs man­quantes du tuple sont intégrées comme NULL dans la table des résultats.

SQL RIGHT OUTER JOIN

Le RIGHT OUTER JOIN suit le même principe que le LEFT OUTER JOIN, mais la table dominante ici n’est pas celle de gauche, mais celle de droite.

L’ensemble de résultats du RIGHT OUTER JOIN comprend tous les tuples de la table du côté droit de l’opérateur JOIN ainsi que les tuples de la table gauche qui rem­plis­sent la condition JOIN. Le symbole suivant est utilisé comme opérateur : .

Nous re­com­men­çons à partir des tables initiales « salaries » et « car » et dé­fi­nis­sons la même condition de sélection pour le RIGHT JOIN qu’avec l’exemple précédent.

L’algèbre re­la­tion­nel :

salaries ⟖ car_id=car_idcar

Ins­truc­tion SQL :

SELECT * FROM salaries RIGHT JOIN car ON salaries.car_id = car.car_id;

Voici l’ensemble de résultats du RIGHT JOIN. On remarque qu’il différe con­si­dé­ra­ble­ment du LEFT JOIN.

Table : RIGHT OUTER JOIN pour les tables « salaries » et « car »

e_id nom prenom salaries.car_id car.car_id marque modele im­ma­tri­cu­la­tion cons­truc­tion region
1 Dupond Jacques 3 3 BMW X6 B MW 780 2017 37
2 Martin Jean 1 1 VW Caddy B KH 778 2016 75
3 Petit Hélène 1 1 VW Caddy B KH 778 2016 75
4 Lefevre Lisa 2 2 Opel Astra B PO 654 2010 41
NULL NULL NULL 4 4 Porsche Boxster B AA 123 2018 36

L’en­re­gis­tre­ment de données pour le salarié Baptiste Barthes n’est pas contenu dans la table de résultats. En effet, le car_id qui lui cor­res­pond est NULL et ne peut donc être affecté à un en­re­gis­tre­ment de données dans la table de droite.

Grâce au RIGHT JOIN, nous obtenons tous les en­re­gis­tre­ments de données de la table "car" – y compris les données pour le car_id 4, auquel aucun tuple de la table "salaries" n’a été affecté. Les valeurs man­quantes sont également éditées ici comme valeurs NULL.

SQL FULL OUTER JOIN

Un FULL OUTER JOIN est une com­bi­nai­son de LEFT OUTER JOIN et RIGHT OUTER JOIN. L’opérateur défini pour l’opération en algèbre re­la­tion­nelle est le suivant : .

Voici de nouveau une il­lus­tra­tion du FULL JOIN avec les tables "salaries" et "car" en donnant la même condition de sélection que pré­cé­dem­ment.

Algèbre re­la­tion­nel :

salaries ⟗ car_id=car_idcar

Ins­truc­tion SQL :

SELECT * FROM salaries FULL JOIN car ON salaries.car_id = car.car_id;

Le résultat cor­res­pond à la table ci-dessous.

Table : FULL OUTER JOIN pour les tables « salaries » et « car »

e_id nom prenom salaries.car_id car.car_id marque modele im­ma­tri­cu­la­tion cons­truc­tion region
1 Dupond Jacques 3 3 BMW X6 B MW 780 2017 37
2 Martin Jean 1 1 VW Caddy B KH 778 2016 75
3 Petit Hélène 1 1 VW Caddy B KH 778 2016 75
4 Lefevre Lisa 2 2 Opel Astra B PO 654 2010 41
5 Barthes Baptiste NULL NULL NULL NULL NULL NULL NULL
NULL NULL NULL 4 4 Porsche Boxster B AA 123 2018 36

Le FULL JOIN relie les données des tables de sortie en fonction de la condition de sélection. Toutefois, il va lister également les données des deux tableaux qui ne rem­plis­sent pas la condition.

Les valeurs man­quantes dans FULL JOIN sont également définies sur NULL.

Note

Dans la pratique, les FULL OUTER JOINs ne sont pas très sig­ni­fi­ca­tifs et ne sont en réalité pas supportés par les systèmes de gestion de bases de données leaders du marché tels que MySQL et MariaDB.

NATURAL OUTER JOIN

Comme les INNER JOINs, les OUTER JOINs peuvent également être im­plé­men­tés en tant que NATURAL JOINs. Les opé­ra­teurs cor­res­pon­dants sont :

LEFT/RIGHT JOIN … USING

Ou :

NATURAL LEFT/RIGHT JOIN

Les NATURAL OUTER JOINs relient les tables à l’aide de colonnes du même nom. Les colonnes sé­lec­tion­nées peuvent être ex­pli­ci­te­ment définies à l’aide du mot-clé USING :

SELECT * FROM salaries LEFT JOIN car USING(car_id);

Vous pouvez écrire votre code de manière sim­pli­fiée également, le SGBD recherche alors au­to­ma­ti­que­ment les colonnes portant le même nom et relie ainsi les tables listées :

SELECT * FROM salaries NATURAL LEFT JOIN car;

Par rapport aux tables d’exemple listées ci-dessus, les deux ins­truc­tions SQL mènent au même résultat.

e_id nom prenom car_id marque modele im­ma­tri­cu­la­tion cons­truc­tion region
1 Dupond Jacques 3 BMW X6 B MW 780 2017 37
2 Martin Jean 1 VW Caddy B KH 778 2016 75
3 Petit Hélène 1 VW Caddy B KH 778 2016 75
4 Lefevre Lisa 2 Opel Astra B PO 654 2010 41
5 Barthes Baptiste NULL NULL NULL NULL NULL NULL

Le NATURL LEFT JOIN combine les colonnes salaries.car_id et car.car_id pour former la colonne commune car_id.

Les OUTER JOINs dans la pratique

Les OUTER JOINs con­dui­sent gé­né­ra­le­ment à des re­grou­pe­ments de tables avec des valeurs Null. Il est donc important de vous demander si vous avez besoin de ces valeurs. Dans notre exemple, la Porsche Boxster n’a pas encore été affectée à un employé. Cela ne ressort pas du tableau "car". Le tableau "salaries" montre d’autre part que Baptiste Barthès n’utilise pas encore de voiture de société mais ne montre pas pour autant qu’une voiture est dis­po­nible. Après un FULL JOIN sur les deux tables, il est clair d’un coup d’œil que Baptiste pourrait conduire la Porsche à l’avenir.

Aller au menu principal