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.
GO TO FULL VERSION