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 :
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
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 :![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
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.