CodeGym /Java Course /All lectures for NL purposes /Gegevens selecteren uit meerdere tabellen

Gegevens selecteren uit meerdere tabellen

All lectures for NL purposes
Niveau 1 , Les 782
Beschikbaar

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.

Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION