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é.