table dépendante
Maintenant, compliquons un peu nos requêtes. Ajoutons une nouvelle table de tâches à notre base de données avec des tâches pour nos employés. Et voyons quelles entrées il contient:
SELECT * FROM task
Le résultat d'une telle demande :
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) |
Ce tableau n'a que 4 colonnes :
- id — numéro de tâche unique (et lignes du tableau) ;
- employee_id — ID de l'employé de la table des employés auquel la tâche est assignée ;
- name — nom et description de la tâche ;
- délai - l'heure à laquelle la tâche doit être terminée.
Faites attention à quelques nuances. La tâche N6 n'a pas d'employee_id, nous n'avons pas de nettoyeur. La tâche est là, mais l'interprète n'y est pas. Ça arrive.
De plus, les tâches 6 à 9 n'ont pas de date limite. Cela se produit lorsqu'une tâche doit être effectuée régulièrement et en continu. Par exemple, le bureau doit être nettoyé tous les jours, mais il faut aussi profiter de la vie au quotidien :)
Si une table utilise les ID d'une autre table, alors une telle table est appelée dependante .
Requête sur plusieurs tables
Ici, nous voyons dans le tableau des tâches qu'il y a deux tâches "Profiter de la vie". Comment savons-nous qui sont ces chanceux ?
Pour ce faire, en SQL, vous pouvez exécuter une requête sur deux tables à la fois. En général, en SQL, vous pouvez interroger n'importe quel nombre de tables en même temps. Le format général d'une telle demande est :
SELECT columns
FROM Table 1, table 2, tableN
Important! Si vous écrivez une requête sur plusieurs tables en même temps, vous obtiendrez le produit dit cartésien des lignes de la table. Chaque rangée du premier tableau sera collée à chaque rangée du deuxième tableau, et ainsi de suite.
Autrement dit, si vous avez 5 lignes dans le premier tableau et 10 lignes dans le second, vous aurez 50 lignes au total. En Java, cette requête ressemblerait à ceci :
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Écrivons notre requête sur deux tables à la fois et voyons ce qui se passe :
SELECT * FROM employee, task
Et le résultat de cette requête :
identifiant | nom | profession | salaire | âge | identifiant | employé | _identifiant | nom | date limite |
---|---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmeur | 100000 | 25 | 1 | 1 | Correction d'un bug sur le frontend | 2022-06-01 | |
2 | Petrov Petr | Programmeur | 80000 | 23 | 1 | 1 | Correction d'un bug sur le frontend | 2022-06-01 | |
3 | Ivanov Sergueï | Testeur | 40000 | trente | 1 | 1 | Correction d'un bug sur le frontend | 2022-06-01 | |
4 | Rabinovitch Moisha | Directeur | 200000 | 35 | 1 | 1 | Correction d'un bug sur le frontend | 2022-06-01 | |
5 | Kirienko Anastasia | Responsable administratif | 40000 | 25 | 1 | 1 | Correction d'un bug sur le frontend | 2022-06-01 | |
6 | Vaska | chat | 1000 | 3 | 1 | 1 | Correction d'un bug sur le frontend | 2022-06-01 | |
1 | Ivanov Ivan | Programmeur | 100000 | 25 | 2 | 2 | Correction d'un bug sur le backend | 2022-06-15 | |
2 | Petrov Petr | Programmeur | 80000 | 23 | 2 | 2 | Correction d'un bug sur le backend | 2022-06-15 | |
3 | Ivanov Sergueï | Testeur | 40000 | trente | 2 | 2 | Correction d'un bug sur le backend | 2022-06-15 | |
4 | Rabinovitch Moisha | Directeur | 200000 | 35 | 2 | 2 | Correction d'un bug sur le backend | 2022-06-15 | |
5 | Kirienko Anastasia | Responsable administratif | 40000 | 25 | 2 | 2 | Correction d'un bug sur le backend | 2022-06-15 |
Nous avons 48 lignes de résultats au total, mais ici je n'en ai donné que 11. Sinon, il n'y aura tout simplement pas assez d'espace.
Faites attention à trois choses :
- Colonnes portant le même nom : id . Il s'agit de l'identifiant de la table des employés et de l'identifiant de la table des tâches .
- Les lignes de chaque tableau sont répétées. Dans la colonne de gauche, ID 6 est à nouveau suivi de ID = 1.
- Nous avons des lignes absurdes où, par exemple, id (de la table employee) est 6 et dans la même ligne employee_id est 1.
Suppression des lignes inutiles
Il y a trop de lignes dans notre table résultante, qui est le produit cartésien de toutes les lignes des deux tables employee et task .
Logiquement, si la ligne employee_id est 3, alors elle ne devrait coller qu'à la ligne de la table employee où id est 3. Essayons de résoudre ce malentendu avec WHERE.
Écrivons une requête comme celle-ci :
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
Et le résultat de cette requête :
identifiant | nom | profession | salaire | âge | identifiant | id_employé | nom | date limite |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmeur | 100000 | 25 | 1 | 1 | Correction d'un bug sur le frontend | 2022-06-01 |
2 | Petrov Petr | Programmeur | 80000 | 23 | 2 | 2 | Correction d'un bug sur le backend | 2022-06-15 |
4 | Rabinovitch Moisha | Directeur | 200000 | 35 | 7 | 4 | Profite de la vie | (NUL) |
5 | Kirienko Anastasia | Responsable administratif | 40000 | 25 | 3 | 5 | Acheter du café | 2022-07-01 |
5 | Kirienko Anastasia | Responsable administratif | 40000 | 25 | 4 | 5 | Acheter du café | 2022-08-01 |
5 | Kirienko Anastasia | Responsable administratif | 40000 | 25 | 5 | 5 | Va acheter du café | 2022-09-01 |
6 | Vaska | chat | 1000 | 3 | 8 | 6 | Profite de la vie | (NUL) |
La bonne nouvelle est que les lignes vides de sens ont disparu : l'id de la première colonne est toujours égal à employee_id.
La mauvaise nouvelle est que les tâches qui ne sont assignées à personne, comme le nettoyage du bureau, ont disparu. Leur employee_id était NULL, ils ont donc été supprimés une fois le WHERE terminé.
GO TO FULL VERSION