avhengig tabell

La oss nå komplisere spørsmålene våre litt. La oss legge til en ny oppgavetabell i databasen vår med oppgaver for våre ansatte. Og la oss se hvilke oppføringer den inneholder:

SELECT * FROM task

Resultatet av en slik forespørsel:

id emploee_id Navn frist
1 1 Rett opp en feil på frontend 2022-06-01
2 2 Rett opp en feil på backend 2022-06-15
3 5 Kjøp kaffe 2022-07-01
4 5 Kjøp kaffe 2022-08-01
5 5 Skal kjøpe kaffe 2022-09-01
6 (NULL) Rydd opp på kontoret (NULL)
7 4 Nyt livet (NULL)
8 6 Nyt livet (NULL)

Denne tabellen har bare 4 kolonner:

  • id - unikt oppgavenummer (og rader i tabellen);
  • ansatt_id — ID for den ansatte fra ansatttabellen som oppgaven er tildelt;
  • navn — navn og beskrivelse av oppgaven;
  • deadline - tidspunktet for når oppgaven skal være fullført.

Vær oppmerksom på noen få nyanser. Oppgave N6 har ikke ansatt_id, vi har ikke renholder. Oppgaven er der, men utøveren er det ikke. Det skjer.

Dessuten har ikke oppgave 6-9 en fastsatt frist. Dette skjer når en oppgave må gjøres regelmessig og kontinuerlig. For eksempel må kontoret ryddes hver dag, men du må også nyte livet hver dag :)

Hvis en tabell bruker IDer fra en annen tabell, kalles en slik tabell avhengig .

Spørr mot flere tabeller

Her ser vi i oppgavetabellen at det er to oppgaver "Å nyte livet". Hvordan vet vi hvem disse heldige er?

For å gjøre dette, i SQL, kan du utføre en spørring på to tabeller samtidig. Generelt, i SQL, kan du spørre etter et hvilket som helst antall tabeller samtidig. Det generelle formatet for en slik forespørsel er:

SELECT columns
FROM Table 1, table 2, tableN

Viktig! Hvis du skriver en spørring til flere tabeller samtidig, vil du som et resultat få det såkalte kartesiske produktet av tabellrader. Hver rad fra det første bordet vil limes til hver rad fra det andre bordet, og så videre.

Det vil si at hvis du har 5 rader i den første tabellen og 10 rader i den andre, vil du ha 50 rader totalt. I Java vil denne spørringen se omtrent slik ut:

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

La oss skrive spørringen vår til to tabeller samtidig og se hva som skjer:

SELECT * FROM employee, task

Og resultatet av denne spørringen:

id Navn okkupasjon lønn alder id ansatt _id Navn frist
1 Ivanov Ivan Programmerer 100 000 25 1 1 Rett opp en feil på frontend 2022-06-01
2 Petrov Petr Programmerer 80 000 23 1 1 Rett opp en feil på frontend 2022-06-01
3 Ivanov Sergey Tester 40 000 tretti 1 1 Rett opp en feil på frontend 2022-06-01
4 Rabinovich Moisha Regissør 200 000 35 1 1 Rett opp en feil på frontend 2022-06-01
5 Kirienko Anastasia Kontorsjef 40 000 25 1 1 Rett opp en feil på frontend 2022-06-01
6 Vaska katt 1000 3 1 1 Rett opp en feil på frontend 2022-06-01
1 Ivanov Ivan Programmerer 100 000 25 2 2 Rett opp en feil på backend 2022-06-15
2 Petrov Petr Programmerer 80 000 23 2 2 Rett opp en feil på backend 2022-06-15
3 Ivanov Sergey Tester 40 000 tretti 2 2 Rett opp en feil på backend 2022-06-15
4 Rabinovich Moisha Regissør 200 000 35 2 2 Rett opp en feil på backend 2022-06-15
5 Kirienko Anastasia Kontorsjef 40 000 25 2 2 Rett opp en feil på backend 2022-06-15

Vi har totalt 48 resultatlinjer, men her har jeg bare gitt 11. Ellers blir det rett og slett ikke nok plass.

Vær oppmerksom på tre ting:

  • Kolonner med samme navn: id . Dette er IDen fra ansatttabellen og IDen fra oppgavetabellen .
  • Radene i hver tabell gjentas. I venstre kolonne er ID 6 etterfulgt av ID = 1 igjen.
  • Vi har tullrader der for eksempel id (fra ansatttabellen) er 6 og i samme rad er ansatt_id 1.

Fjerne meningsløse linjer

Det er for mange rader i den resulterende tabellen, som er det kartesiske produktet av alle radene i de to tabellene ansatt og oppgave .

Logisk, hvis raden ansatt_id er 3, så skal den bare holde seg til raden fra ansatttabellen der id er 3. La oss prøve å fikse denne misforståelsen med WHERE.

La oss skrive et spørsmål som dette:

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

Og resultatet av denne spørringen:

id Navn okkupasjon lønn alder id emploee_id Navn frist
1 Ivanov Ivan Programmerer 100 000 25 1 1 Rett opp en feil på frontend 2022-06-01
2 Petrov Petr Programmerer 80 000 23 2 2 Rett opp en feil på backend 2022-06-15
4 Rabinovich Moisha Regissør 200 000 35 7 4 Nyt livet (NULL)
5 Kirienko Anastasia Kontorsjef 40 000 25 3 5 Kjøp kaffe 2022-07-01
5 Kirienko Anastasia Kontorsjef 40 000 25 4 5 Kjøp kaffe 2022-08-01
5 Kirienko Anastasia Kontorsjef 40 000 25 5 5 Skal kjøpe kaffe 2022-09-01
6 Vaska katt 1000 3 8 6 Nyt livet (NULL)

Den gode nyheten er at de meningsløse linjene har forsvunnet: ID-en fra den første kolonnen er alltid lik ansatt_id.

Den dårlige nyheten er at oppgaver som ikke er tildelt noen, som å vaske kontoret, er borte. Medarbeider-ID-en deres var NULL, så de ble forkastet etter at WHERE ble utført.