afhankelijke tafel
Laten we onze vragen nu wat ingewikkelder maken. Laten we een nieuwe takentabel toevoegen aan onze database met taken voor onze medewerkers. En laten we eens kijken welke vermeldingen het bevat:
SELECT * FROM task
Het resultaat van een dergelijk verzoek:
ID kaart | medewerker_id | naam | deadline |
---|---|---|---|
1 | 1 | Los een bug op de frontend op | 01-06-2022 |
2 | 2 | Los een bug op de backend op | 2022-06-15 |
3 | 5 | Koop koffie | 01-07-2022 |
4 | 5 | Koop koffie | 01-08-2022 |
5 | 5 | Zal koffie kopen | 01-09-2022 |
6 | (NUL) | Ruim het kantoor op | (NUL) |
7 | 4 | Geniet van het leven | (NUL) |
8 | 6 | Geniet van het leven | (NUL) |
Deze tabel heeft slechts 4 kolommen:
- id — uniek taaknummer (en rijen in de tabel);
- employee_id — ID van de werknemer uit de werknemerstabel aan wie de taak is toegewezen;
- naam — naam en beschrijving van de taak;
- deadline - de tijd waarop de taak moet zijn voltooid.
Let op enkele nuances. Taak N6 heeft geen employee_id, we hebben geen schoonmaker. De taak is er, maar de uitvoerder niet. Het gebeurt.
Taken 6-9 hebben ook geen vaste deadline. Dit gebeurt wanneer een taak regelmatig en continu moet worden uitgevoerd. Het kantoor moet bijvoorbeeld elke dag worden schoongemaakt, maar je moet ook elke dag genieten van het leven :)
Als een tabel ID's uit een andere tabel gebruikt, wordt zo'n tabel afhankelijk genoemd .
Query op meerdere tabellen
Hier zien we in de takentabel dat er twee taken “Genieten van het leven” zijn. Hoe weten we wie deze gelukkigen zijn?
Om dit te doen, kunt u in SQL een query op twee tabellen tegelijk uitvoeren. Over het algemeen kunt u in SQL een willekeurig aantal tabellen tegelijk opvragen. Het algemene formaat voor een dergelijk verzoek is:
SELECT columns
FROM Table 1, table 2, tableN
Belangrijk! Als u een query naar meerdere tabellen tegelijk schrijft, krijgt u als resultaat het zogenaamde Cartesiaanse product van tabelrijen. Elke rij van de eerste tabel wordt aan elke rij van de tweede tabel gelijmd, enzovoort.
Dat wil zeggen, als u 5 rijen in de eerste tabel heeft en 10 rijen in de tweede, dan heeft u in totaal 50 rijen. In Java zou deze query er ongeveer zo uitzien:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Laten we onze query naar twee tabellen tegelijk schrijven en kijken wat er gebeurt:
SELECT * FROM employee, task
En het resultaat van deze vraag:
ID kaart | naam | bezigheid | salaris | leeftijd | ID kaart | werknemer | _ID kaart | naam | deadline |
---|---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmeur | 100000 | 25 | 1 | 1 | Los een bug op de frontend op | 01-06-2022 | |
2 | Petrov Petr | Programmeur | 80000 | 23 | 1 | 1 | Los een bug op de frontend op | 01-06-2022 | |
3 | Ivanov Sergej | Tester | 40000 | dertig | 1 | 1 | Los een bug op de frontend op | 01-06-2022 | |
4 | Rabinovich Moisha | Regisseur | 200000 | 35 | 1 | 1 | Los een bug op de frontend op | 01-06-2022 | |
5 | Kirienko Anastasia | Officemanager | 40000 | 25 | 1 | 1 | Los een bug op de frontend op | 01-06-2022 | |
6 | Vaska | kat | 1000 | 3 | 1 | 1 | Los een bug op de frontend op | 01-06-2022 | |
1 | Ivanov Ivan | Programmeur | 100000 | 25 | 2 | 2 | Los een bug op de backend op | 2022-06-15 | |
2 | Petrov Petr | Programmeur | 80000 | 23 | 2 | 2 | Los een bug op de backend op | 2022-06-15 | |
3 | Ivanov Sergej | Tester | 40000 | dertig | 2 | 2 | Los een bug op de backend op | 2022-06-15 | |
4 | Rabinovich Moisha | Regisseur | 200000 | 35 | 2 | 2 | Los een bug op de backend op | 2022-06-15 | |
5 | Kirienko Anastasia | Officemanager | 40000 | 25 | 2 | 2 | Los een bug op de backend op | 2022-06-15 |
We hebben in totaal 48 resultaatregels, maar hier heb ik er slechts 11 gegeven. Anders is er simpelweg niet genoeg ruimte.
Let op drie dingen:
- Kolommen met dezelfde naam: id . Dit is het id uit de medewerkerstabel en het id uit de taaktabel .
- De rijen van elke tabel worden herhaald. In de linkerkolom wordt ID 6 weer gevolgd door ID = 1.
- We hebben onzinnige rijen waar bijvoorbeeld id (uit de werknemerstabel) 6 is en in dezelfde rij werknemer_id 1 is.
Zinloze lijnen verwijderen
Er zijn te veel rijen in onze resulterende tabel, die het Cartesiaanse product is van alle rijen van de twee tabellen werknemer en taak .
Logischerwijs, als de rij employee_id 3 is, dan zou het alleen moeten blijven bij de rij van de werknemerstabel waar id 3 is. Laten we proberen dit misverstand op te lossen met WHERE.
Laten we een query als deze schrijven:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
En het resultaat van deze vraag:
ID kaart | naam | bezigheid | salaris | leeftijd | ID kaart | medewerker_id | naam | deadline |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmeur | 100000 | 25 | 1 | 1 | Los een bug op de frontend op | 01-06-2022 |
2 | Petrov Petr | Programmeur | 80000 | 23 | 2 | 2 | Los een bug op de backend op | 2022-06-15 |
4 | Rabinovich Moisha | Regisseur | 200000 | 35 | 7 | 4 | Geniet van het leven | (NUL) |
5 | Kirienko Anastasia | Officemanager | 40000 | 25 | 3 | 5 | Koop koffie | 01-07-2022 |
5 | Kirienko Anastasia | Officemanager | 40000 | 25 | 4 | 5 | Koop koffie | 01-08-2022 |
5 | Kirienko Anastasia | Officemanager | 40000 | 25 | 5 | 5 | Zal koffie kopen | 01-09-2022 |
6 | Vaska | kat | 1000 | 3 | 8 | 6 | Geniet van het leven | (NUL) |
Het goede nieuws is dat de nietszeggende regels zijn verdwenen: het id uit de eerste kolom is altijd gelijk aan employee_id.
Het slechte nieuws is dat taken die aan niemand zijn toegewezen, zoals het schoonmaken van het kantoor, wegvallen. Hun employee_id was NULL, dus ze werden weggegooid nadat de WHERE was gedaan.
GO TO FULL VERSION