Retour à la liste des articles Articles
29 minutes de lecture

Les 10 principales questions d'entretien sur SQL JOIN et comment y répondre

Vous êtes-vous déjà demandé quelles questions sur SQL JOIN pourraient vous être posées lors d'un entretien ? Vous sentez-vous prêt à y répondre ? Cet article traite des questions d'entretien les plus courantes sur SQL JOIN et de la manière d'y répondre.

Si vous postulez à un emploi d'analyste de données ou de développeur de logiciels, vous serez probablement interrogé sur vos connaissances en SQL JOIN. Les clauses SQL JOIN sont un sujet sur lequel les recruteurs peuvent vous interroger. Il existe de nombreuses variantes de la clause JOIN, et chacune remplit une fonction différente.

Il existe de nombreuses ressources intéressantes pour apprendre les clauses SQL JOIN, comme le cours interactif Les jointures en SQL de LearnSQL.fr. Cet article aborde le sujet dans l'optique d'un entretien et couvre certaines des questions d'entretien les plus courantes sur SQL JOIN auxquelles vous pouvez vous attendre.

  1. Qu'est-ce qu'une commande SQL JOIN, et quand en avez-vous besoin ?
  2. Comment écrire une requête pour lier ces deux tables ?
  3. Quels sont les types de jointures existants ?
  4. Qu'est-ce qu'un JOIN OUTER ?
  5. Quelle est la différence entre un INNER JOIN SQL et un LEFT JOIN SQL ?
  6. Quelle est la différence entre un LEFT JOIN et un FULL JOIN ?
  7. Écrivez une requête qui liera ces deux tables de manière à ce que toutes les lignes de la Table 1 figurent dans le résultat.
  8. Comment lier plus de deux tables ?
  9. Comment lier une table à elle-même ?
  10. La condition du JOIN doit-elle être l'égalité ?

1. Qu'est-ce qu'une commande SQL JOIN, et quand en avez-vous besoin ?

La commande SQL JOIN est utilisée pour combiner les données de deux tables en SQL. La clause JOIN est souvent utilisée lorsque les tables ont au moins une colonne de données en commun.

Généralement, la condition JOIN est une égalité entre les colonnes des différentes tables, mais d'autres conditions JOIN sont également possibles. Vous pouvez lier plus de deux tables en utilisant des clauses JOIN consécutives.

Il existe différents types de jointures : INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, et d'autres. Le fonctionnement de la commande JOIN est illustré par cette image :

JOINT INTERNE

2. Comment écrire une requête pour lier ces deux tables ?

Au cours de l'entretien, il se peut que l'on vous demande d'appliquer vos connaissances à un scénario pratique en écrivant une commande JOIN. Prenons un exemple pour que vous puissiez résoudre ce problème facilement.

Nous avons deux tables :

  • employees - Cette table contient l'identifiant, le nom et l'identifiant du département de chaque employé.

idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • departments - Cette table contient l'identifiant et le nom de chaque département.

iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research And Development

Si l'on vous a demandé d'écrire une requête sur JOIN, essayez de trouver une colonne qui existe dans chacune des tables. Dans cet exemple, il s'agit de la colonne department_id.

SELECT *
FROM employees
JOIN departments
ON employees.department_id = departments.department_id;

L'exécution de ce code produira le résultat suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources

La condition ON indique comment les deux tables (celle qui suit FROM et celle qui suit JOIN) doivent être combinées. Vous pouvez voir dans l'exemple ci-dessus que les deux tables contiennent la colonne department_id. Notre requête SQL renverra les lignes où employees.department_id est égal à departments.department_id.

Parfois, les champs relationnels sont un peu moins évidents. Par exemple, vous pouvez avoir une table appelée employés avec un champ appelé id, qui pourrait être lié à employee_id dans n'importe quelle autre table.

Vous pouvez également spécifier les colonnes exactes que vous souhaitez renvoyer à partir de chacune des tables incluses dans votre clause JOIN. Lorsque vous incluez un nom de colonne qui existe dans les deux tables, vous devez spécifier la table exacte à partir de laquelle vous souhaitez le récupérer.

Nous ne pouvons pas écrire department_id car cela provoquerait une erreur d'ambiguïté en SQL. Nous devons écrire employees.department_id ou departments.department_id. Par exemple, nous pourrions écrire :

SELECT
employees.department_id, employee_name, department_name
FROM employees
JOIN departments
ON employees.department_id = departments.department_id;

Remarquez notre déclaration SELECT. Nous avons spécifié le nom exact de la table pour la colonne department_id car cette colonne existe dans les deux tables qui composent notre clause JOIN. Nous n'avons pas à le faire pour les colonnes employee_name ou department_name car elles sont uniques. L'exécution de cette requête SQL produit le jeu de résultats suivant :

idemployee_namedepartment_name
1Ned FlandersSales
3Clancy WiggumHuman Resources
4Homer SimpsonCustomer Service
5Barney GumbleResearch And Development

Lors de la rédaction de nos clauses SQL JOIN, nous pouvons également utiliser des alias SQL. Les noms de colonnes peuvent être assez techniques et peu compréhensibles. Cela peut rendre le résultat de la requête difficile à comprendre. Voici quelques règles à suivre lors de l'implémentation d'un alias SQL :

  • Pour donner un nom descriptif à une colonne, vous pouvez utiliser un alias de colonne.
  • Pour attribuer un alias à une colonne, utilisez le mot-clé AS suivi de l'alias.
  • Si l'alias contient des espaces, vous devez l'indiquer.

Un alias SQL peut être appliqué à la fois aux noms de tables et aux noms de colonnes. Si nous réécrivons notre requête précédente pour inclure un alias pour chaque nom de colonne, elle peut ressembler à ceci :

SELECT
employees.department_id AS ID,
employee_name AS ‘Employee Name’,
department_name AS Department
FROM employees
JOIN departments
ON employees.department_id = departments.department_id;

Remarquez que nous avons dû utiliser des guillemets pour notre colonne ‘Employee Name’ car ce nouveau nom contient des espaces.

Si nous réécrivons notre code ci-dessus, en utilisant cette fois un alias pour chaque nom de table, nous obtenons ce qui suit :

SELECT *
FROM employees AS emp
JOIN departments AS dep
ON emp.department_id = dep.department_id;

Le mot-clé AS utilisé ici est également totalement facultatif. Vous pouvez l'omettre dans la déclaration. En appliquant cette petite modification, notre code se présente comme suit :

SELECT *
FROM employees emp
JOIN departments dep
ON emp.department_id = dep.department_id;

Cela devrait être toutes les informations dont vous avez besoin pour effectuer un JOIN entre deux tables et répondre aux questions que vous pourriez vous poser concernant la syntaxe de base de JOIN.

3. Quels sont les types de JOIN ?

Comme indiqué dans l'introduction de cet article, il existe de nombreuses variantes de la clause SQL JOIN. Démontrer que vous maîtrisez chaque commande est une façon de montrer vos connaissances sur SQL JOIN. Voici quelques-uns des types de clauses JOIN les plus courants que vous rencontrerez :

JOINTURE INTERNE SQL

La clause INNER JOIN est la clause par défaut JOIN en SQL. Si vous regardez notre exemple précédent (SELECT * FROM employees JOIN departments), il s'agissait en fait d'un INNER JOIN.

La clause INNER JOIN est utilisée pour renvoyer les lignes des deux tables qui satisfont à la condition donnée. La clause INNER JOIN fait correspondre les lignes de la première et de la deuxième table qui satisfont à la condition ON.

Cette image illustre la relation entre les deux tables incluses dans notre clause INNER JOIN:

JOINT INTERNE

Explorons plus avant la syntaxe et les fonctionnalités de INNER JOIN en examinant un exemple pratique utilisant les deux tables, employees et departments décrites ci-dessus.

Le code SQL suivant recherche des correspondances entre les tables employees et departments sur la base de la colonne department_id.

SELECT * from employees emp
INNER JOIN departments dep
ON emp.department_id = dep.department_id;

L'exécution de ce code produira le résultat suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources

En regardant notre résultat, vous remarquerez que notre employé, Moe Szyslak, est absent. Dans notre table employees cet employé n'a pas d'adresse actuelle (colonne department_id). Par conséquent, aucune correspondance n'a pu être trouvée lorsque vous essayez d'effectuer le JOIN sur la table departments sur cette colonne. L'employé est donc exclu du résultat. Nous allons résoudre ce problème avec le type suivant: JOIN, LEFT JOIN.

Si vous souhaitez voir d'autres exemples de INNER JOINs, un article contenant des exemples visuels et faciles à comprendre peut vous aider à appréhender ce sujet complexe.

JOINTURE GAUCHE SQL

Semblable à la clause INNER JOIN, la clause LEFT JOIN vous permet d'interroger les données de deux tables. Mais quelle est la différence essentielle entre LEFT JOIN et INNER JOIN ? Un LEFT JOIN renvoie toutes les lignes qui se trouvent dans la première table (de gauche) indiquée. Les lignes correspondantes de la table de droite sont également renvoyées.

Lorsque vous utilisez la clause LEFT JOIN, les concepts de table de gauche et de table de droite sont introduits.

JOINT GAUCHE

Dans le schéma ci-dessus, la table 1 est la table de gauche et la table 2 est la table de droite.

La clause LEFT JOIN sélectionne les données à partir de la table de gauche. Elle fait correspondre chaque ligne de la table de gauche aux lignes de la table de droite en fonction de la condition de la clause JOIN.

La clause SQL LEFT JOIN renvoie toutes les lignes de la table de gauche, même si aucune correspondance n'est trouvée dans la table de droite. Cela signifie que si la clause ON ne correspond à aucun enregistrement dans la table de droite, la clause JOIN renverra quand même une ligne dans le résultat, mais avec NULL dans chaque colonne de la table de droite.

Une requête SQL LEFT JOIN renvoie toutes les valeurs de la table de gauche, plus les valeurs correspondantes de la table de droite. Si aucune correspondance n'a pu être trouvée, LEFT JOIN renvoie une valeur NULL à la place.

La syntaxe de notre clause SQL LEFT JOIN est la suivante :

SELECT * FROM employees emp
LEFT JOIN departments dep
ON emp.department_id = dep.department_id;

Nous spécifions que nous voulons un LEFT JOIN. Ce sera le même pour tous les types de JOIN. Précisez la variante de JOIN que vous utilisez avant le mot-clé JOIN.

Le mot-clé ON fonctionne de la même manière que pour notre exemple INNER JOIN. Nous recherchons dans la table des employés les valeurs correspondantes entre la colonne department_id de notre table employees et la colonne department_id de notre table departments.

Ici, notre table employees sera la table de gauche car c'est la première table que nous spécifions.

Le résultat de l'exécution de cette requête SQL serait le jeu de résultats suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Remarquez que notre employé, Moe Szyslak, a été inclus dans le jeu de résultats, même s'il n'y a pas de correspondance avec department_id dans la table departments dans la table. C'est exactement l'objectif de la clause LEFT JOIN, qui consiste à inclure toutes les données de notre table de gauche, que des correspondances aient été trouvées ou non.

JOINTURE DROITE SQL

RIGHT JOIN est similaire à LEFT JOIN, sauf que l'action effectuée sur les tables liées est inversée. Essentiellement, il exécute l'action opposée à celle de LEFT JOIN. Cela signifie qu'un RIGHT JOIN renvoie toutes les valeurs de la table de droite, plus les valeurs correspondantes de la table de gauche ou NULL en cas d'absence de prédicat correspondant à JOIN.

Dans le schéma ci-dessous, la table 2 est notre table de droite et la table 1 est notre table de gauche :

RIGHT JOIN

Lorsque nous appliquons le code suivant à nos tables employees et departments :

SELECT * FROM employees emp
RIGHT JOIN departments dep
ON emp.department_id = dep.department_id;

La syntaxe est similaire à celle de la clause LEFT JOIN. Nous indiquons que nous voulons effectuer un RIGHT JOIN, en recherchant spécifiquement des correspondances entre la table departments et la table employees.

Ici, notre table employees servira de table de gauche, car c'est la première table que nous spécifions. La table departments sera la table de droite. Le résultat de l'exécution de cette requête SQL JOIN serait le jeu de résultats suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
2Ned Flanders11Sales
NULLNULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

Le RIGHT JOIN commence à sélectionner les données de la table de droite (departments). Elle fait correspondre chaque ligne de la table de droite avec chaque ligne de la table de gauche. Si les deux lignes donnent lieu à une évaluation de la condition JOIN, elle combine les colonnes en une nouvelle ligne et inclut cette nouvelle ligne dans le jeu de résultats.

JOINTURE COMPLÈTE SQL

La jointure SQL FULL JOIN combine les résultats des jointures externes gauche et droite. La table liée contient tous les enregistrements des deux tables et remplit les valeurs NULL pour les correspondances manquantes de part et d'autre.

Sachez qu'un FULL JOIN peut potentiellement renvoyer un très grand ensemble de données. Le FULL JOIN renvoie toutes les lignes des tables liées, qu'elles soient appariées ou non.

Le SQL FULL JOIN est un type de OUTER JOIN (nous y reviendrons plus tard dans l'article), c'est pourquoi il peut également être appelé FULL OUTER JOIN.

Voici le concept d'un SQL FULL JOIN clairement illustré :

FULL JOIN

Remarquez que dans notre diagramme, chaque ligne des deux tables est retournée.

Examinons la syntaxe de la clause SQL FULL JOIN à l'aide d'un exemple de code.

SELECT * FROM employees emp
FULL JOIN departments dep
ON emp.department_id = dep.department_id;

Lorsque cette requête SQL est exécutée dans notre base de données sur employees et departments, elle produit le résultat suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
2Ned Flanders11Sales
NULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

Comparez cet ensemble de résultats avec les résultats de nos LEFT JOIN et RIGHT JOIN. Vous verrez que ces données sont une combinaison des données renvoyées dans nos exemples précédents. Ce type spécifique de clause JOIN produit un vaste ensemble de données. Réfléchissez bien avant d'utiliser la clause FULL JOIN.

JOINTURE CROISÉE SQL

La clause SQL CROSS JOIN est utilisée lorsque vous avez besoin de connaître toutes les possibilités de combinaison de deux tables, où le jeu de résultats comprend chaque ligne de chaque table contributrice. La clause CROSS JOIN renvoie le produit cartésien des lignes des tables liées.

Le diagramme ci-dessous illustre bien la manière dont les lignes sont combinées :

CROSS JOIN

L'utilisation de CROSS JOIN produit un ensemble de résultats dont la taille est le nombre de lignes de la première table multiplié par le nombre de lignes de la deuxième table. Ce type de résultat est appelé le produit cartésien de deux tables (Table 1 x Table 2).

Reprenons nos deux tables de tout à l'heure :

  • La table employees
idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • La table departments
idemployee_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research And Development

Pour effectuer un CROSS JOIN en utilisant ces tables, nous écririons une requête SQL comme suit :

SELECT * FROM employees
CROSS JOIN departments;

Remarquez que CROSS JOIN n'utilise pas ON ou USING lorsqu'il est déclaré. Ceci est différent des clauses JOIN que nous avons examinées précédemment.

Après avoir effectué un CROSS JOIN, l'ensemble des résultats se présenterait comme suit :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson41Sales
2Ned Flanders11Sales
3Barney Gumble51Sales
4Clancy Wiggum31Sales
5Moe SzyslakNULL1Sales
1Homer Simpson42Engineering
2Ned Flanders12Engineering
3Barney Gumble52Engineering
4Clancy Wiggum32Engineering
5Moe SzyslakNULL2Engineering
1Homer Simpson43Human Resources
2Ned Flanders13Human Resources
3Barney Gumble53Human Resources
4Clancy Wiggum33Human Resources
5Moe SzyslakNULL3Human Resources
1Homer Simpson44Customer Service
2Ned Flanders14Customer Service
3Barney Gumble54Customer Service
4Clancy Wiggum34Customer Service
5Moe SzyslakNULL4Customer Service
1Homer Simpson45Research And Development
2Ned Flanders15Research And Development
3Barney Gumble55Research And Development
4Clancy Wiggum35Research And Development
5Moe SzyslakNULL5Research And Development

Notre ensemble de résultats contient toutes les combinaisons possibles entre les deux tables. Même lorsque les tables utilisées contiennent peu de données, comme dans le cas de nos tables employees et departments, elles peuvent produire un ensemble de résultats très important lorsqu'elles sont utilisées conjointement avec la clause SQL CROSS JOIN.

JOINTURE NATURELLE SQL

Un NATURAL JOIN est un type de JOIN qui combine des tables basées sur des colonnes ayant le même nom et le même type de données. Lorsque vous utilisez la clause NATURAL JOIN, elle crée pour vous une clause JOIN implicite basée sur les colonnes communes des deux tables liées.

Les colonnes communes sont des colonnes qui ont le même nom dans les deux tables. Il n'est pas nécessaire de spécifier les noms des colonnes à lier. La table résultante ne contiendra pas de colonnes répétées.

La syntaxe de la requête NATURAL JOIN est simple :

SELECT * FROM employees
NATURAL JOIN departments;

Lorsque cette requête est exécutée, elle produit le jeu de résultats suivant :

department_ididemployee_namedepartment_name
12Ned FlandersSales
34Clancy WiggumHuman Resources
41Homer SimpsonCustomer Service
53Barney GumbleResearch And Development

Le NATURAL JOIN est exécuté sur la colonne qui est partagée entre nos deux tables. Dans ce cas, il s'agit de la colonne department_id. Cette colonne partagée n'est affichée qu'une seule fois dans notre ensemble de résultats.

4. Qu'est-ce qu'un OUTER JOIN ?

Avec un SQL OUTER JOIN, les lignes non correspondantes dans une ou deux tables peuvent être retournées. Il existe plusieurs variantes de la clause OUTER JOIN, dont certaines ont déjà été abordées dans cet article. Voici les types courants de clauses OUTER JOIN:

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

LEFT JOIN est un synonyme de LEFT OUTER JOIN. La fonctionnalité des deux est identique. C'est peut-être l'une des questions d'entretien SQL JOIN que l'on vous pose ! On peut dire la même chose de RIGHT JOIN et RIGHT OUTER JOIN, et de FULL JOIN et FULL OUTER JOIN. Voyons un exemple pour chacune d'elles.

JOINTURE EXTERNE GAUCHE SQL

Utilisez LEFT OUTER JOIN lorsque vous voulez tous les résultats qui se trouvent dans la première table listée. Une clause LEFT OUTER JOIN renvoie uniquement les lignes correspondantes de la deuxième table.

La syntaxe de la clause LEFT OUTER JOIN est la suivante :

SELECT * FROM employees emp
LEFT OUTER JOIN departments dep
ON emp.department_id = dep.department_id;

Le résultat de l'exécution de cette requête SQL serait le jeu de résultats suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Remarquez comment notre employé, Moe Syzslak, a été inclus dans le jeu de résultats même s'il n'y a pas de correspondance avec department_id de la table departments dans la table. C'est exactement l'objectif de la clause LEFT OUTER JOIN, qui consiste à inclure toutes les données de notre table de gauche, qu'aucune correspondance n'ait été trouvée ou non.

JOINTURE EXTERNE DROITE SQL

RIGHT OUTER JOIN est similaire à LEFT OUTER JOIN, sauf que l'action effectuée sur les tables liées est inversée. Elle effectue essentiellement l'action inverse de LEFT OUTER JOIN. Cela signifie que RIGHT OUTER JOIN renvoie toutes les valeurs de la table de droite, plus les valeurs correspondantes de la table de droite ou NULL en cas d'absence de correspondance.

Lorsque nous appliquons la clause RIGHT OUTER JOIN à nos tables employees et departments, le code se présente comme suit :

SELECT * FROM employees emp
RIGHT OUTER JOIN departments dep
ON emp.department_id = dep.department_id;

Ici, notre table employees sera la table de gauche, car c'est la première table que nous spécifions.

Le résultat de l'exécution de cette requête SQL serait le jeu de résultats suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
2Ned Flanders11Sales
NULLNULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

Le RIGHT OUTER JOIN commence à sélectionner les données dans la table de droite, dans ce cas, notre table departments. Il fait correspondre chaque ligne de la table de droite avec chaque ligne de la table de gauche. Si les deux lignes donnent lieu à une évaluation de la condition JOIN, elle combine les colonnes en une nouvelle ligne et inclut cette nouvelle ligne dans le jeu de résultats.

JOINTURE EXTERNE COMPLÈTE SQL

Le FULL OUTER JOIN combine les résultats des jointures externes gauche et droite. La table liée contiendra tous les enregistrements des deux tables et remplira les NULL en cas de correspondance manquante de part et d'autre. Le FULL OUTER JOIN renvoie toutes les lignes des tables liées, qu'elles soient correspondantes ou non.

Examinons la syntaxe de la clause SQL FULL OUTER JOIN:

SELECT * FROM employees emp
FULL OUTER JOIN departments dep
ON emp.department_id = dep.department_id;

Lorsque cette requête SQL est exécutée sur notre base de données employees et departments, elle produit le résultat suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
2Ned Flanders11Sales
NULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

Vous remarquerez que cet ensemble de données est une combinaison de nos requêtes précédentes LEFT OUTER JOIN et RIGHT OUTER JOIN.

5. Quelle est la différence entre un INNER JOIN SQL et un LEFT JOIN SQL ?

Il y a quelques différences essentielles à retenir à propos de ces variantes de JOIN couramment utilisées. INNER JOIN renvoie des lignes lorsqu'il y a une correspondance dans les deux tables. LEFT JOIN renvoie toutes les lignes de la table de gauche et toutes les lignes correspondantes de la table de droite.

Prenons un exemple pratique pour explorer les différences entre ces clauses. Cela vous aidera à répondre en toute confiance à cette question d'entretien SQL JOIN courante.

Imaginons que nous ayons deux tables :

  • employees - Cette table contient l'identifiant, le nom et l'identifiant du département de chaque employé.
idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • departments - Cette table contient l'identifiant et le nom de chaque département.
iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

Le code SQL suivant recherche des correspondances entre les tables employees et departments sur la base de la colonne department_id:

SELECT * from employees emp
INNER JOIN departments dep
ON emp.department_id = dep.department_id;

L'exécution de ce code produira le résultat suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources

En regardant notre résultat, vous remarquerez que notre employé, Moe Szyslak, est absent. Dans notre table employees cet employé n'a pas d'adresse actuelle (colonne department_id). Par conséquent, aucune correspondance n'a pu être trouvée lorsque vous essayez de lier la table departments sur cette colonne. L'employé est donc exclu du résultat.

Maintenant, utilisons un LEFT JOIN et voyons quel résultat cela produit. Un SQL LEFT JOIN renvoie toutes les valeurs de la table de gauche, plus les valeurs correspondantes de la table de droite. Si aucune correspondance n'a pu être trouvée, LEFT JOIN renvoie une valeur NULL.

La syntaxe de notre clause SQL LEFT JOIN est la suivante :

SELECT * FROM employees emp
LEFT JOIN departments dep
ON emp.department_id = dep.department_id;

Le mot-clé ON fonctionne de la même manière que pour notre exemple INNER JOIN. Nous recherchons dans la table des employés les valeurs correspondantes entre la colonne department_id de notre table employees et la colonne department_id de notre table departments.

Ici, notre table employees sera la table de gauche, car c'est la première table que nous spécifions.

Le résultat de l'exécution de cette requête SQL est le jeu de résultats suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Remarquez que Moe Szyslak a été inclus dans cet ensemble de résultats, même s'il n'y a pas de valeur correspondante dans la table department_id. departments correspondant. C'est exactement l'objectif de la clause LEFT JOIN, qui consiste à inclure toutes les données de notre table de gauche, que des correspondances aient été trouvées ou non.

6. Quelle est la différence entre un LEFT JOIN et un FULL JOIN ?

C'est l'une des questions SQL JOIN auxquelles vous pouvez être confronté tout au long du processus d'entretien.

Comme nous l'avons mentionné précédemment, un SQL LEFT JOIN renvoie toutes les valeurs de la table de gauche, plus les valeurs correspondantes de la table de droite. Si aucune correspondance n'est trouvée, LEFT JOIN renvoie une valeur NULL à la place. Une requête SQL FULL JOIN renvoie toutes les lignes des tables liées, qu'elles soient appariées ou non. Il combine essentiellement la fonctionnalité de LEFT JOIN et RIGHT JOIN.

Comparons le jeu de résultats d'une clause LEFT JOIN au jeu de résultats d'une clause FULL JOIN.

Voici une requête qui fait appel à LEFT JOIN:

SELECT * FROM employees emp
LEFT JOIN departments dep
ON emp.department_id = dep.department_id;

Ici, notre table employees sera la table de gauche, car c'est la première table que nous spécifions.

Le résultat de l'exécution de cette requête SQL est :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Voyons comment cela se compare à l'utilisation d'une clause SQL FULL JOIN. La syntaxe est similaire, comme le montre ce code :

SELECT * FROM employees emp
FULL JOIN departments dep
ON emp.department_id = dep.department_id;

Lorsque cette requête SQL est exécutée contre nos tables employees et departments, le résultat est le suivant :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
NULLNULLNULL2Engineering

Comparez cet ensemble de résultats avec les résultats de nos requêtes LEFT JOIN et RIGHT JOIN. Vous pouvez voir qu'aucune correspondance n'a été trouvée pour le service d'ingénierie, mais qu'il a quand même été renvoyé. Il est clair que ces données sont une combinaison des données renvoyées par nos exemples précédents. Ce type spécifique de clause JOIN produit un vaste ensemble de données. Réfléchissez bien avant d'utiliser une clause SQL FULL JOIN.

7. Écrivez une requête qui liera ces deux tables de manière à ce que toutes les lignes de la Table 1 figurent dans le résultat.

Lors d'un entretien pour un poste d'analyste de données ou de développeur de logiciels, on peut vous demander de relever un défi technique impliquant SQL. Une tâche courante de l'entretien sur SQL JOIN consiste à écrire une requête qui liera deux tables d'une certaine manière. Imaginons que l'on vous demande d'écrire une requête qui liera deux tables de manière à ce que toutes les lignes de la table 1 se retrouvent dans le résultat.

Tout d'abord, vous devez comprendre le concept de tables de droite et de gauche.

JOINT GAUCHE

Dans le schéma ci-dessus, la table 1 est la table de gauche et la table 2 est la table de droite. En d'autres termes, la table de gauche vient en premier dans la requête ; elle doit son nom au fait qu'elle se trouve à gauche de la condition de jointure. La table de droite vient après le mot-clé JOIN.

La clause LEFT JOIN sélectionne les données à partir de la table de gauche. Elle fait correspondre chaque ligne de la table de gauche avec les lignes de la table de droite, en fonction de la condition de la clause JOIN. Elle renvoie toutes les valeurs de la table de gauche, plus les valeurs correspondantes de la table de droite. Si aucune correspondance n'est trouvée, LEFT JOIN renvoie une valeur NULL. Cela signifie que si la clause ON ne correspond à aucun enregistrement de la table de droite, la clause JOIN renverra toujours cette ligne, mais avec un NULL dans chaque colonne de la table de droite.

Pour notre exemple pratique, nous allons utiliser les tables employees et departments de notre exemple précédent :

employees - Cette table contient l'identifiant, le nom et l'identifiant du département de chaque employé.

idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL

departments - Cette table contient l'identifiant et le nom de chaque département.

iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

Si nous voulons conserver toutes les lignes de la table 1 (dans ce cas, employees), nous devons spécifier cette table comme étant notre table de gauche.

La syntaxe de cette clause LEFT JOIN est la suivante :

SELECT * FROM employees emp
LEFT JOIN departments dep
ON emp.department_id = dep.department_id;

L'exécution de cette requête produit cet ensemble de résultats :

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Remarquez que l'employé Moe Szyslak a été inclus dans cet ensemble de résultats - même s'il n'y a pas de correspondance avec department_id dans la table departments dans la table. C'est exactement l'objectif de la clause LEFT JOIN, qui consiste à inclure toutes les données de notre table de gauche, qu'il y ait ou non des correspondances dans la table de droite.

8. Comment lier plus de deux tables ?

La jointure de plus de deux tables dans une seule requête SQL peut être assez difficile à comprendre pour les nouveaux venus. L'exemple suivant devrait vous éclairer.

Vous effectuez un JOIN sur plus de deux tables lorsque les données que vous souhaitez inclure dans le résultat existent dans trois tables ou plus. Une jointure multi-table nécessite des opérations consécutives sur JOIN: d'abord, vous joignez la première et la deuxième table et obtenez un ensemble de résultats virtuel ; ensuite, vous joignez une autre table à cette table virtuelle. Voyons un exemple.

Pour notre exemple de jointure multiple, imaginons que nous ayons trois tables :

departments - Cette table contient l'identifiant et le nom de chaque département.

iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

office - Cette table contient l'adresse de chaque bureau.

idaddress
15 Wisteria Lane, Springfield, USA
2124 Chestmount Street, Springfield, USA
36610 Bronzeway, Springfield, USA
4532 Executive Lane, Springfield, USA
510 Meadow View, Springfield, USA

department_office - Cette table relie les informations du bureau au département associé. Certains départements peuvent couvrir plusieurs bureaux.

office_iddepartment_id
11
23
32
44
55
21
51
43

Dans notre cas, nous avons utilisé une table de liens appelée department_office qui lie departments aux bureaux.

Pour écrire une requête SQL qui imprime les attributs department_name et address les uns à côté des autres, nous devons lier trois tables :

  • La première clause JOIN liera departments et department_office et créera une table temporaire qui aura une colonne office_id.
  • La deuxième instruction JOIN liera cette table temporaire à la table office sur office_id pour obtenir le résultat souhaité.

Examinez la requête SQL ci-dessous :

SELECT department_name, address
FROM departments d
JOIN department_office do ON d.department_id=do.department_id
JOIN office o ON do.office_id=o.id;

Vous pouvez voir que nous voulons juste récupérer deux colonnes, le nom du département et l'adresse associée. Nous joignons la table department_office qui a un lien avec nos deux tables departments et office . Cela nous permet ensuite de lier la table office qui contient la colonne address dans notre déclaration SELECT.

L'exécution de ce code produit l'ensemble de résultats suivant :

department_nameaddress
Sales5 Wisteria Lane, Springfield, USA
Engineering124 Chestmount Street, Springfield, USA
Human Resources6610 Bronzeway, Springfield, USA
Customer Service532 Executive Lane, Springfield, USA
Research and Development10 Meadow View, Springfield, USA
Sales124 Chestmount Street, Springfield, USA
Sales10 Meadow View, Springfield, USA
Human Resources532 Executive Lane, Springfield, USA

Et voilà ! Nous avons le résultat souhaité, à savoir chaque département et son adresse correspondante. Remarquez que notre département des ventes est le plus grand, avec trois bureaux différents. Le deuxième plus grand département est celui des Ressources humaines, qui couvre deux bureaux différents.

Vous pouvez voir comment les clauses JOIN peuvent être utilisées sur plusieurs tables pour créer des liens entre les tables qui ont des colonnes en commun. Il existe de nombreuses situations dans lesquelles la jointure de plusieurs tables peut être utile ; pour plus d'informations, consultez cet article sur la façon de lier trois tables ou plus en SQL.

9. Comment lier une table à elle-même ?

De nombreux débutants ne le savent pas, mais vous pouvez lier une table à elle-même. Une telle opération est communément appelée une auto-jointure. Elle est utile pour interroger des données hiérarchiques ou comparer des lignes au sein d'une même table. Lorsque vous utilisez une auto-jointure, il est important d'utiliser un alias SQL pour chaque table.

Pour notre exemple d'auto-jointure, nous utiliserons la table suivante :

employee - Cette table stocke tous les noms des employés de l'entreprise, les identifiants de leurs départements et les identifiants de leurs responsables.

idemployee_namedepartment_idmanager_id
1Montgomery Burns4NULL
2Waylon Smithers11
3Homer Simpson21
4Carl Carlson51
5Lenny Leonard31
6Frank Grimes23

Supposons que nous voulions un ensemble de résultats qui ne montre que les employés avec leurs responsables. Cela peut être facilement réalisé en utilisant des alias de table en combinaison avec une auto-jointure. Nous allons utiliser un SQL LEFT JOIN pour notre première auto-jointure. Regardez le code ci-dessous :

SELECT
e.employee_name AS 'Employee',
m.employee_name AS 'Manager'
FROM employee e
LEFT JOIN employee m ON m.id = e.manager_id

Faites attention à l'erreur de colonne ambiguë, qui peut se produire si vous ne faites pas attention lorsque vous écrivez une requête d'auto-jointure. Pour éviter cette erreur, vous devez faire bon usage des alias SQL, c'est-à-dire donner un alias à chaque occurrence de la table dans votre requête SQL. C'est ce que démontre l'extrait suivant de la requête ci-dessus :

FROM employee e LEFT JOIN employee m

Vous devez également préfixer les noms des colonnes avec l'alias de la table afin que la table à laquelle chaque colonne fait référence soit claire. Nous avons explicitement spécifié e.employee_name et m.employee_name.

Ces règles vous aideront à exécuter avec succès une requête SQL avec auto-jointure tout en évitant l'erreur de colonne ambiguë.

L'exécution de la requête ci-dessus donne le jeu de résultats suivant :

EmployeeManager
Montgomery BurnsNULL
Waylon SmithersMontgomery Burns
Homer SimpsonMontgomery Burns
Carl CarlsonMontgomery Burns
Lenny LeonardMontgomery Burns
Frank GrimesHomer Simpson

Voilà le résultat souhaité ! Vous pouvez clairement voir chaque employé et son responsable correspondant. La plupart des employés dépendent de M. Burns, mais le responsable de Frank Grimes est Homer Simpson. Remarquez la valeur NULL dans la colonne Manager pour Montgomery Burns. Cela s'explique par le fait que Montgomery Burns n'a pas de responsable - il est le directeur.

Modifions légèrement la requête et utilisons cette fois-ci un INNER JOIN:

SELECT
e.employee_name AS 'Employee',
m.employee_name AS 'Manager'
FROM employee e
INNER JOIN tbl_employee m ON m.id = e.manager_id
EmployeeManager
Waylon SmithersMontgomery Burns
Homer SimpsonMontgomery Burns
Carl CarlsonMontgomery Burns
Lenny LeonardMontgomery Burns
Frank GrimesHomer Simpson

La seule différence majeure est l'absence de Montgomery Burns dans la colonne Employé. La seule différence majeure est l'absence de Montgomery Burns dans la colonne Employé, car la valeur manager_id lui correspondant était NULL ; INNER JOIN ne renvoie que les colonnes correspondantes, à l'exclusion des valeurs NULL.

Vous pouvez maintenant effectuer des auto-jointures, qui sont applicables dans de nombreux cas d'utilisation différents. Si vous souhaitez voir d'autres exemples de jointures automatiques, consultez cet excellent guide illustré des jointures automatiques.

10. La condition du JOIN doit-elle être l'égalité ?

Une non équi-jointure est une clause de JOIN qui n'utilise pas l'égalité ( = ) comme condition de jointure. Vous pouvez utiliser les opérateurs de comparaison courants (par exemple, <, >, <=, >=, != et <>) avec les clauses de jointure. L'opérateur BETWEEN peut également être utilisé.

Les non équi-jointures peuvent s'avérer utiles dans de nombreuses situations, notamment pour lister les paires uniques, les enregistrements d'une plage et les doublons. Examinons notre dernier exemple de cas d'utilisation : comment identifier les doublons à l'aide d'une non équi-jointure.

Tout d'abord, regardez les données que nous allons interroger. Nous utiliserons une seule table, la table familière employee pour cet exemple :

idemployee_namedepartment_idmanager_id
1Montgomery Burns4NULL
2Waylon Smithers11
3Homer Simpson21
4Carl Carlson51
5Lenny Leonard31
6Frank Grimes23
7Lenny Leonard31

Si nous voulions identifier rapidement les valeurs en double, nous écririons la requête suivante, qui fait bon usage d'une non équi-jointure :

SELECT e1.id, e1.employee_name, e2.id, e2.employee_name
FROM employee e1
JOIN employee e2
ON e1.employee_name = e2.employee_name AND e1.id < e2.id

En examinant de plus près la clause JOIN, nous constatons qu'elle comporte deux conditions :

  1. Elle correspond aux enregistrements qui ont le même nom.
  2. Elle récupère les enregistrements dont l'identifiant est inférieur à l'identifiant de la table temporaire d'auto-jointure.

L'exécution de cette requête produit le jeu de résultats suivant :

idemployee_nameidemployee_name
5Lenny Leonard7Lenny Leonard

Nous pouvons voir que Lenny Leonard a un enregistrement en double dans cette table. Les doublons peuvent provoquer des erreurs imprévisibles et altérer les données de vos rapports.

Ce n'est qu'un des nombreux exemples possibles qui démontrent l'utilité des non équi-jointures. Il existe d'autres excellentes ressources disponibles en ligne, comme cet article qui présente des applications pratiques des non équi-jointures.

Réponses aux 10 principales questions d'entretien sur SQL

Vous êtes maintenant équipé des connaissances nécessaires pour répondre aux questions d'entretien complexes de SQL JOIN. Si vous vous sentez encore dépassé ou si vous n'êtes pas sûr des clauses SQL JOIN, vous trouverez ici d'excellents conseils sur la meilleure façon de vous entraîner aux clauses SQL JOIN.

Vous pouvez l'utiliser en combinaison avec l'antisèche SQL JOIN, qui constitue un excellent outil de référence pour les programmeurs SQL novices et expérimentés. Que vous soyez novice en SQL ou que vous ressentiez le besoin de rafraîchir vos connaissances sur le sujet, ce cours interactif Les jointures en SQL constitue une merveilleuse ressource d'apprentissage.