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