beroende tabell
Låt oss nu komplicera våra frågor lite. Låt oss lägga till en ny uppgiftstabell i vår databas med uppgifter för våra anställda. Och låt oss se vilka poster den innehåller:
SELECT * FROM task
Resultatet av en sådan begäran:
id | emploee_id | namn | deadline |
---|---|---|---|
1 | 1 | Fixa en bugg på frontend | 2022-06-01 |
2 | 2 | Fixa en bugg på backend | 2022-06-15 |
3 | 5 | Köp kaffe | 2022-07-01 |
4 | 5 | Köp kaffe | 2022-08-01 |
5 | 5 | Ska köpa kaffe | 2022-09-01 |
6 | (NULL) | Städa kontoret | (NULL) |
7 | 4 | Njut av livet | (NULL) |
8 | 6 | Njut av livet | (NULL) |
Den här tabellen har bara 4 kolumner:
- id — unikt uppgiftsnummer (och rader i tabellen);
- anställd_id — ID för den anställde från anställningstabellen till vilken uppgiften är tilldelad;
- namn — namn och beskrivning av uppgiften.
- deadline - den tidpunkt då uppgiften ska vara klar.
Var uppmärksam på några nyanser. Uppgift N6 har inte ett staff_id, vi har ingen städare. Uppgiften finns där, men utföraren är det inte. Det händer.
Uppgifterna 6-9 har heller ingen fastställd deadline. Detta händer när en uppgift måste utföras regelbundet och kontinuerligt. Till exempel behöver kontoret städas varje dag, men du behöver också njuta av livet varje dag :)
Om en tabell använder ID från en annan tabell kallas en sådan tabell beroende .
Fråga mot flera tabeller
Här ser vi i uppgiftstabellen att det finns två uppgifter "Njuta av livet". Hur vet vi vilka dessa lyckliga är?
För att göra detta, i SQL, kan du köra en fråga på två tabeller samtidigt. I allmänhet kan du i SQL fråga hur många tabeller som helst samtidigt. Det allmänna formatet för en sådan begäran är:
SELECT columns
FROM Table 1, table 2, tableN
Viktig! Om du skriver en fråga till flera tabeller samtidigt får du som ett resultat den så kallade kartesiska produkten av tabellrader. Varje rad från det första bordet kommer att limmas på varje rad från det andra bordet, och så vidare.
Det vill säga, om du har 5 rader i den första tabellen och 10 rader i den andra, så kommer du att ha 50 rader totalt. I Java skulle den här frågan se ut ungefär så här:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Låt oss skriva vår fråga till två tabeller samtidigt och se vad som händer:
SELECT * FROM employee, task
Och resultatet av denna fråga:
id | namn | ockupation | lön | ålder | id | anställd | _id | namn | deadline |
---|---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmerare | 100 000 | 25 | 1 | 1 | Fixa en bugg på frontend | 2022-06-01 | |
2 | Petrov Petr | Programmerare | 80 000 | 23 | 1 | 1 | Fixa en bugg på frontend | 2022-06-01 | |
3 | Ivanov Sergey | Testare | 40 000 | trettio | 1 | 1 | Fixa en bugg på frontend | 2022-06-01 | |
4 | Rabinovich Moisha | Direktör | 200 000 | 35 | 1 | 1 | Fixa en bugg på frontend | 2022-06-01 | |
5 | Kirienko Anastasia | Kontors chef | 40 000 | 25 | 1 | 1 | Fixa en bugg på frontend | 2022-06-01 | |
6 | Vaska | katt | 1000 | 3 | 1 | 1 | Fixa en bugg på frontend | 2022-06-01 | |
1 | Ivanov Ivan | Programmerare | 100 000 | 25 | 2 | 2 | Fixa en bugg på backend | 2022-06-15 | |
2 | Petrov Petr | Programmerare | 80 000 | 23 | 2 | 2 | Fixa en bugg på backend | 2022-06-15 | |
3 | Ivanov Sergey | Testare | 40 000 | trettio | 2 | 2 | Fixa en bugg på backend | 2022-06-15 | |
4 | Rabinovich Moisha | Direktör | 200 000 | 35 | 2 | 2 | Fixa en bugg på backend | 2022-06-15 | |
5 | Kirienko Anastasia | Kontors chef | 40 000 | 25 | 2 | 2 | Fixa en bugg på backend | 2022-06-15 |
Vi har totalt 48 resultatrader, men här har jag bara gett 11. Annars kommer det helt enkelt inte att finnas tillräckligt med utrymme.
Var uppmärksam på tre saker:
- Kolumner med samma namn: id . Detta är id från anställdtabellen och id från uppgiftstabellen .
- Raderna i varje tabell upprepas. I den vänstra kolumnen följs ID 6 av ID = 1 igen.
- Vi har nonsensrader där till exempel id (från anställningstabellen) är 6 och på samma rad är anställd_id 1.
Ta bort meningslösa linjer
Det finns för många rader i vår resulterande tabell, som är den kartesiska produkten av alla rader i de två tabellerna anställd och uppgift .
Logiskt sett, om raden anställd_id är 3, så bör den bara hålla sig till raden från anställningstabellen där id är 3. Låt oss försöka åtgärda detta missförstånd med WHERE.
Låt oss skriva en fråga så här:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
Och resultatet av denna fråga:
id | namn | ockupation | lön | ålder | id | emploee_id | namn | deadline |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmerare | 100 000 | 25 | 1 | 1 | Fixa en bugg på frontend | 2022-06-01 |
2 | Petrov Petr | Programmerare | 80 000 | 23 | 2 | 2 | Fixa en bugg på backend | 2022-06-15 |
4 | Rabinovich Moisha | Direktör | 200 000 | 35 | 7 | 4 | Njut av livet | (NULL) |
5 | Kirienko Anastasia | Kontors chef | 40 000 | 25 | 3 | 5 | Köp kaffe | 2022-07-01 |
5 | Kirienko Anastasia | Kontors chef | 40 000 | 25 | 4 | 5 | Köp kaffe | 2022-08-01 |
5 | Kirienko Anastasia | Kontors chef | 40 000 | 25 | 5 | 5 | Ska köpa kaffe | 2022-09-01 |
6 | Vaska | katt | 1000 | 3 | 8 | 6 | Njut av livet | (NULL) |
Den goda nyheten är att de meningslösa raderna har försvunnit: ID:t från den första kolumnen är alltid lika med anställd_id.
Den dåliga nyheten är att uppgifter som inte är tilldelade någon, som att städa kontoret, är borta. Deras anställd_id var NULL, så de kasserades efter att WHERE gjordes.