Retour à la liste des articles Articles
8 minutes de lecture

Comment conserver les lignes non appariées lorsque vous joignez deux tables en SQL ?

Apprenez à utiliser JOIN pour conserver les lignes appariées et non appariées lorsque vous joignez deux tables.

La jonction de deux ou plusieurs tables est une compétence dont vous avez souvent besoin si vous travaillez avec des bases de données. Pour réviser et pratiquer vos compétences en matière de jointure SQL, je vous recommande le cours interactif Les jointures en SQL interactif. Il contient plus de 90 exercices et sections sur différents défis de jointure.

Si vous joignez souvent des tables en SQL, vous avez probablement remarqué que toutes les données d'une table ne correspondent pas toujours aux données d'une autre table. Parfois, vous n'avez besoin que des données qui ont une correspondance dans les deux tables. Et parfois, vous devez également conserver les lignes non correspondantes. Comment faire dans un JOIN?

Quel JOIN vous permet d'obtenir les lignes non correspondantes ?

Vous le savez probablement déjà, mais cela vaut la peine de le répéter. Le but de JOIN est d'obtenir les données de deux ou plusieurs tables. Vous les réunissez par la ou les colonnes qu'elles ont en commun.

Les quatre principaux types de JOINs sont :

  • (INNER) JOIN.
  • LEFT (OUTER) JOIN.
  • RIGHT (OUTER) JOIN.
  • FULL (OUTER) JOIN.

Lorsque vous utilisez un simple (INNER) JOIN, vous n'obtenez que les lignes qui ont des correspondances dans les deux tables. La requête ne renverra pas les lignes non correspondantes, sous quelque forme que ce soit.

Si ce n'est pas ce que vous voulez, la solution consiste à utiliser LEFT JOIN, RIGHT JOIN ou FULL JOIN, en fonction de ce que vous souhaitez voir.

Si vous ne connaissez pas le site JOIN, vous trouverez ici une explication détaillée de chaque type dejointure. Vous pouvez également disposer d'un aide-mémoire SQL JOINpour vous aider à maîtriser la syntaxe et l'utilisation de JOIN.

Apprenez à connaître les données

Les données avec lesquelles nous allons travailler se composent de deux tables :

  • employee.
  • project.

La table employee comporte quatre colonnes :

  • id: L'ID de l'employé ; c'est la clé primaire (PK) de la table.
  • first_name: Le prénom de l'employé.
  • last_name: Le nom de famille de l'employé.
  • project_id: L'ID du projet et la clé étrangère (FK) de la table, qui fait référence à une autre table appelée project.

Voici à quoi ressemblent les données de la table employee Voici à quoi ressemblent les données du tableau :

idfirst_namelast_nameproject_id
1IngaDansken1
2RosinaSneezem5
3DarRisbie4
4LyneaBraveyNULL
5AlanahAbrashkov4
6EmmitJaime4
7KarrieLatek5
8GarrettCreginNULL
9CecilioZiemkeNULL
10MalanieChapellow1
11FraydaPinkett1
12MaddiMullissNULL
13BlaneTue5
14CarverVeighey5
15ChristosManleyNULL

Il y a deux colonnes dans le tableau project:

  • id: L'ID du projet ; c'est la clé primaire (PK) de la table.
  • project_name: Le nom du projet.

Et voici les données de la table :

idproject_name
1Reporting Process
2Database Enhancement
3Sales Boosting
4Employee Satisfaction
5IT Security
6Diversity Program
7Policies & Procedures
8Social Media Visibility
9Mobile Banking
10Education

Que se passe-t-il lorsque vous utilisez le INNER JOIN ?

Pour obtenir le nom des employés et les projets sur lesquels ils travaillent en utilisant le INNER JOIN, vous devrez écrire ce code :

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
JOIN project p
  ON e.project_id = p.id;

Note : Bien sûr, vous pouvez utiliser le mot-clé JOIN ou INNER JOIN - ils sont identiques.

Voici ce que vous obtenez comme résultat :

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security

Le résultat ne montre que les lignes du tableau employee qui correspondent aux lignes du tableau project. En d'autres termes, le code renvoie uniquement les employés auxquels un projet a été attribué. Cependant, cela signifie que chaque table peut avoir des lignes qui ne correspondent pas à l'autre table. Il peut y avoir des employés qui ne sont affectés à aucun projet, et il peut y avoir des projets auxquels aucun employé n'est affecté.

Comment obtenir également les lignes non correspondantes ?

Obtenir toutes les lignes appariées et non appariées d'une table

Pour obtenir toutes les lignes d'une seule table (les lignes appariées et les lignes non appariées), vous devez utiliser la commande LEFT JOIN ou RIGHT JOIN. Le choix de la commande dépend de la table dans laquelle vous souhaitez conserver les lignes non appariées. LEFT JOIN le fera à partir de la table de gauche, RIGHT JOIN à partir de la table de droite. Laissez-moi vous montrer ce que cela signifie en pratique.

Utilisation du LEFT JOIN

Pour obtenir les lignes appariées et non appariées d'une table à l'aide de LEFT JOIN, vous devez écrire ce code :

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
LEFT JOIN project p
  ON e.project_id = p.id;

C'est presque le même code que dans l'exemple précédent. La seule différence est qu'il utilise le mot clé LEFT JOIN au lieu de JOIN. Vous obtiendrez ainsi toutes les données de la table de gauche (employeedans ce cas), et toutes les données correspondantes du tableau de droite (project). Lorsqu'il n'y a pas de données correspondantes dans le tableau projectvous obtenez les valeurs NULL, mais vous obtenez toujours toutes les valeurs du tableau employee. Voyez par vous-même :

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

Comment interpréter ces données ? Vous avez tous les employés et les projets sur lesquels ils travaillent. Lorsqu'il y a une valeur NULL dans la colonne project_name, cela signifie que l'employé en question ne travaille sur aucun projet.

Utilisation de la jointure droite (RIGHT JOIN)

Maintenant, écrivons le même code avec RIGHT JOIN au lieu d'utiliser LEFT JOIN.

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
RIGHT JOIN project p
  ON e.project_id = p.id;

C'est une image miroir du code précédent. Il renvoie toutes les données du tableau de droite, projectet seulement les lignes correspondantes du tableau de gauche, employee. Encore une fois, s'il n'y a pas de données correspondantes dans le tableau employeeles valeurs seront NULL.

Voici le résultat de la requête :

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation

Maintenant, ces données montrent tous les projets qui existent dans le tableau project. Lorsque les colonnes first_name et last_name correspondent à NULL, cela signifie qu'aucun employé ne travaille sur ce projet.

Le FULL JOIN vous donnera-t-il toutes les lignes correspondantes et non correspondantes ?

Je pense que la requête utilisant le FULL JOIN et son résultat parlent d'eux-mêmes. Voyons ce qu'elle fait. Tout d'abord, la requête :

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
FULL JOIN project p
  ON e.project_id = p.id;

Encore une fois, la seule différence avec les requêtes précédentes est le type de jointure utilisé. Tout le reste est identique. Cette requête FULL JOIN renvoie les données suivantes :

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

Inspectons un peu les données. Certaines lignes se retrouvent dans les deux tableaux. Cependant, certaines lignes de la table employee qui n'ont pas de lignes correspondantes dans le tableau project. Vous pouvez identifier ces lignes grâce aux valeurs de NULL dans la colonne project_name. Il existe également des lignes de la table project qui n'ont pas de lignes correspondantes dans le tableau employee. Là encore, c'est là que se trouvent les valeurs NULL. Cette fois, les valeurs NULLs se trouvent dans les colonnes first_name et last_name.

Quand utiliser quelle JOIN

Maintenant que vous avez vu ce que chaque JOIN renvoie, clarifions ce que fait chaque JOIN.

Les requêtes JOIN ou INNER JOIN ne renvoient pas du tout les lignes non correspondantes. Elle renvoie uniquement les lignes qui correspondent dans les deux tables que vous joignez. Si vous souhaitez obtenir des lignes non correspondantes, vous ne devez pas l'utiliser.

Avec LEFT JOIN et RIGHT JOIN, vous obtenez à la fois des lignes appariées et non appariées. Cependant, vous devez savoir à partir de quelle table vous obtenez les lignes non appariées. En fonction de vos besoins, vous utiliserez soit LEFT JOIN, soit RIGHT JOIN. Ces deux méthodes permettent d'obtenir toutes les lignes d'une table (appariées et non appariées) et toutes les lignes correspondantes de l'autre table. Si aucune ligne correspondante n'est trouvée dans l'autre table, les colonnes de l'autre table affichent les valeurs NULL.

L'adresse FULL JOIN vous permet d'obtenir toutes les données de toutes les tables que vous joignez. C'est comme si vous combiniez les trois jointures ci-dessus. Vous obtenez toutes les lignes correspondantes comme lorsque vous utilisez INNER JOIN. Vous obtenez également les lignes non correspondantes de la table de gauche et de la table de droite. C'est comme si vous utilisiez simultanément LEFT JOIN et RIGHT JOIN.

Voici d'autres exemples pour vous entraîner à joindre les tables.

Apprenez les différents types de jointure pour choisir celle dont vous avez besoin !

Vous voyez, connaître le fonctionnement de ces JOINs est très utile. Ils vous permettent de joindre deux ou plusieurs tableaux et d'obtenir différentes combinaisons de données à partir de chaque tableau. Il n'y a aucune différence dans la façon dont vous écrivez le code. La seule chose qui change est le mot clé que vous utilisez en fonction du type de JOIN dont vous avez besoin. Il est vraiment important de comprendre les données que chacun de ces JOINs renvoie.

Pour maîtriser et pratiquer cette compétence, le cours SQL pour les débutants et lecours SQL JOINssont ce qu'il vous faut ! Si vous avez besoin de conseils sur la façon de pratiquer lesJOINs, voici quelques astuces.