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.