Raisons de OUTER JOIN

Au fait, vous souvenez-vous quand nous avons fusionné nos feuilles de calcul et que nos tâches de nettoyage de bureau ont disparu parce qu'il n'y avait pas encore de nettoyeur ?

Si vous exécutez une requête comme celle-ci :

SELECT * FROM task

On obtient alors ce résultat :

identifiant id_employé nom date limite
1 1 Correction d'un bug sur le frontend 2022-06-01
2 2 Correction d'un bug sur le backend 2022-06-15
3 5 Acheter du café 2022-07-01
4 5 Acheter du café 2022-08-01
5 5 Va acheter du café 2022-09-01
6 (NUL) Nettoyer le bureau (NUL)
7 4 Profite de la vie (NUL)
8 6 Profite de la vie (NUL)

La tâche "Clear Office" disparaît si nous essayons de joindre la table des tâches à la table des employés par employee_id.

Pour résoudre ce problème, divers modificateurs ont été ajoutés à l'opérateur JOIN qui permettent à ces lignes orphelines d'être stockées sans paire dans une autre table.

Permettez-moi de vous rappeler la forme classique de l'opérateur JOIN :

table 1 JOIN table 2 ON condition

Nous pouvons dire à SQL Server de s'assurer que toutes les données de la table de gauche (table1) sont présentes dans la table jointe. Même s'il n'y a pas de paire pour eux dans le bon tableau. Pour ce faire, il vous suffit d'écrire :

table 1 LEFT JOIN table 2 ON condition

Si vous voulez que la table jointe ait toutes les lignes de la bonne table , alors vous devez écrire :

table 1 RIGHT JOIN table 2 ON
 condition

Écrivons une requête qui combinera toutes les tâches et tous les employés afin que les tâches sans exécuteur ne soient pas perdues. Pour cela, écrivez une requête :

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

Et le résultat de cette requête :

identifiant nom profession salaire âge join_date identifiant id_employé nom
1 Ivanov Ivan Programmeur 100000 25 2012-06-30 1 1 Correction d'un bug sur le frontend
2 Petrov Petr Programmeur 80000 23 2013-08-12 2 2 Correction d'un bug sur le backend
4 Rabinovitch Moisha Directeur 200000 35 2015-05-12 7 4 Profite de la vie
5 Kirienko Anastasia Responsable administratif 40000 25 2015-10-10 3 5 Acheter du café
5 Kirienko Anastasia Responsable administratif 40000 25 2015-10-10 4 5 Acheter du café
5 Kirienko Anastasia Responsable administratif 40000 25 2015-10-10 5 5 Acheter du café
6 Vaska chat 1000 3 2018-11-11 8 6 Profite de la vie
(NUL) (NUL) (NUL) (NUL) (NUL) (NUL) 6 (NUL) Nettoyer le bureau

Une autre ligne a été ajoutée à notre table et, fait intéressant, elle contient de nombreuses valeurs NULL. Toutes les données extraites de la table des employés sont affichées comme NULL, car il n'y avait pas d'exécuteur de la table des employés pour la tâche "Nettoyer le bureau".

Type de jointure

Il existe 4 types de JOIN au total. Ils sont présentés dans le tableau ci-dessous :

Brève entrée entrée longue Explication
1 REJOINDRE JOINTURE INTERNE Uniquement les enregistrements qui se trouvent dans les tables A et B
2 JOINT GAUCHE JOINTURE EXTERNE GAUCHE Toutes les lignes sans paire du tableau A doivent être
3 JOINDRE À DROITE JOINT EXTERNE DROIT Toutes les lignes sans paire du tableau B doivent être
4 JOINT EXTERNE JOINT EXTERNE COMPLET Toutes les lignes de paires de bases des tableaux A et B doivent être

Pour simplifier, si nous représentons les tables sous forme d'ensembles, alors JOIN peut être affiché sous forme d'image :

L'intersection d'ensemble signifie que pour une table, il existe un enregistrement correspondant d'une autre table à laquelle il se réfère.

Question de l'entretien

Parfois, les programmeurs novices sont bombardés d'une question très simple lors d'un entretien. Compte tenu de nos tableaux, il peut être formulé comme suit :

"Écrivez une requête qui affichera une liste de tous les employés pour lesquels il n'y a pas de tâches ." Essayons d'abord de reformuler un peu cette question : "Écrivez une requête qui affichera une liste de tous les employés de la table des employés pour lesquels il n'y a pas de tâches dans la table des tâches ." Nous devons obtenir cet ensemble :

Il existe de nombreuses façons de résoudre ce problème, mais je vais commencer par la plus simple : d'abord, vous pouvez joindre nos tables avec un LEFT JOIN, puis utiliser WHERE pour exclure toutes les lignes pour lesquelles les données manquantes ont été remplies avec des valeurs NULL.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

Et le résultat de cette requête :

identifiant nom profession salaire âge join_date identifiant id_employé nom
3 Ivanov Sergueï Testeur 40000 trente 2014-01-01 (NUL) (NUL) (NUL)

Le seul inconvénient de cette solution est qu'ici les lignes de la table contiennent NULL, et par condition nous devons afficher une liste d'employés.

Pour ce faire, vous devez soit lister les colonnes requises de la table des employés dans SELECT, soit si vous avez besoin de toutes les afficher, vous pouvez écrire la construction suivante :

SELECT e.* FROM employee e, task t 

La requête complète ressemblera à ceci :

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

le résultat de cette requête :

identifiant nom profession salaire âge join_date
3 Ivanov Sergueï Testeur 40000 trente 2014-01-01

Le reste des méthodes vous est laissé comme devoir. Je ne veux pas vous priver du plaisir de les trouver vous-même.