afhængig tabel

Lad os nu komplicere vores forespørgsler lidt. Lad os tilføje en ny opgavetabel til vores database med opgaver til vores medarbejdere. Og lad os se, hvilke poster den indeholder:

SELECT * FROM task

Resultatet af en sådan anmodning:

id emploee_id navn deadline
1 1 Ret en fejl på frontend 2022-06-01
2 2 Ret en fejl på backend 2022-06-15
3 5 Køb kaffe 2022-07-01
4 5 Køb kaffe 2022-08-01
5 5 Vil købe kaffe 2022-09-01
6 (NUL) Ryd op på kontoret (NUL)
7 4 Nyd livet (NUL)
8 6 Nyd livet (NUL)

Denne tabel har kun 4 kolonner:

  • id — unikt opgavenummer (og rækker i tabellen);
  • medarbejder_id — ID for medarbejderen fra medarbejdertabellen, som opgaven er tildelt;
  • navn — navn og beskrivelse af opgaven;
  • deadline - det tidspunkt, hvor opgaven skal være afsluttet.

Vær opmærksom på nogle få nuancer. Opgave N6 har ikke et medarbejder-id, vi har ikke en rengøringsassistent. Opgaven er der, men udøveren er ikke. Det sker.

Desuden har opgave 6-9 ikke en fastsat deadline. Dette sker, når en opgave skal udføres regelmæssigt og kontinuerligt. Fx skal kontoret gøres rent hver dag, men du skal også nyde livet hver dag :)

Hvis en tabel bruger ID'er fra en anden tabel, kaldes en sådan tabel afhængig .

Forespørg mod flere tabeller

Her ser vi i opgavetabellen, at der er to opgaver "Nyde livet". Hvordan ved vi, hvem disse heldige er?

For at gøre dette kan du i SQL udføre en forespørgsel på to tabeller på én gang. Generelt kan du i SQL forespørge et hvilket som helst antal tabeller på samme tid. Det generelle format for en sådan anmodning er:

SELECT columns
FROM Table 1, table 2, tableN

Vigtig! Hvis du skriver en forespørgsel til flere tabeller på samme tid, vil du som følge heraf få det såkaldte kartesiske produkt af tabelrækker. Hver række fra den første tabel vil blive limet til hver række fra den anden tabel, og så videre.

Det vil sige, at hvis du har 5 rækker i den første tabel og 10 rækker i den anden, så vil du have 50 rækker i alt. I Java ville denne forespørgsel se sådan ud:

for (String row1 : table1)
{
	for (String row2 : table2)
   {
  	System.out.println(row1 + row2);
   }
}

Lad os skrive vores forespørgsel til to tabeller på én gang og se, hvad der sker:

SELECT * FROM employee, task

Og resultatet af denne forespørgsel:

id navn beskæftigelse løn alder id ansat _id navn deadline
1 Ivanov Ivan Programmer 100.000 25 1 1 Ret en fejl på frontend 2022-06-01
2 Petrov Petr Programmer 80.000 23 1 1 Ret en fejl på frontend 2022-06-01
3 Ivanov Sergey Tester 40.000 tredive 1 1 Ret en fejl på frontend 2022-06-01
4 Rabinovich Moisha Direktør 200.000 35 1 1 Ret en fejl på frontend 2022-06-01
5 Kirienko Anastasia Kontorchef 40.000 25 1 1 Ret en fejl på frontend 2022-06-01
6 Vaska kat 1000 3 1 1 Ret en fejl på frontend 2022-06-01
1 Ivanov Ivan Programmer 100.000 25 2 2 Ret en fejl på backend 2022-06-15
2 Petrov Petr Programmer 80.000 23 2 2 Ret en fejl på backend 2022-06-15
3 Ivanov Sergey Tester 40.000 tredive 2 2 Ret en fejl på backend 2022-06-15
4 Rabinovich Moisha Direktør 200.000 35 2 2 Ret en fejl på backend 2022-06-15
5 Kirienko Anastasia Kontorchef 40.000 25 2 2 Ret en fejl på backend 2022-06-15

Vi har 48 resultatlinjer i alt, men her har jeg kun givet 11. Ellers bliver der simpelthen ikke plads nok.

Vær opmærksom på tre ting:

  • Kolonner med samme navn: id . Dette er id'et fra medarbejdertabellen og id'et fra opgavetabellen .
  • Rækkerne i hver tabel gentages. I venstre kolonne efterfølges ID 6 af ID = 1 igen.
  • Vi har nonsensrækker, hvor fx id (fra medarbejdertabellen) er 6 og i samme række medarbejder_id er 1.

Fjernelse af meningsløse linjer

Der er for mange rækker i vores resulterende tabel, som er det kartesiske produkt af alle rækkerne i de to tabeller medarbejder og opgave .

Logisk, hvis rækken medarbejder_id er 3, så skal den kun holde sig til rækken fra medarbejdertabellen, hvor id er 3. Lad os prøve at rette denne misforståelse med WHERE.

Lad os skrive en forespørgsel som denne:

SELECT * FROM employee, task 
WHERE emploee.id = task.emploee_id 

Og resultatet af denne forespørgsel:

id navn beskæftigelse løn alder id emploee_id navn deadline
1 Ivanov Ivan Programmer 100.000 25 1 1 Ret en fejl på frontend 2022-06-01
2 Petrov Petr Programmer 80.000 23 2 2 Ret en fejl på backend 2022-06-15
4 Rabinovich Moisha Direktør 200.000 35 7 4 Nyd livet (NUL)
5 Kirienko Anastasia Kontorchef 40.000 25 3 5 Køb kaffe 2022-07-01
5 Kirienko Anastasia Kontorchef 40.000 25 4 5 Køb kaffe 2022-08-01
5 Kirienko Anastasia Kontorchef 40.000 25 5 5 Vil købe kaffe 2022-09-01
6 Vaska kat 1000 3 8 6 Nyd livet (NUL)

Den gode nyhed er, at de meningsløse linjer er forsvundet: id'et fra den første kolonne er altid lig med werknemer_id.

Den dårlige nyhed er, at opgaver, der ikke er tildelt nogen, såsom rengøring på kontoret, er væk. Deres werknemer_id var NULL, så de blev kasseret efter WHERE var udført.