Nestede spørringer i SQL
SQL-språket lar deg legge ett søk i et annet søk. Dette gjør det mulig å skrive en veldig stor spørring som vil gjøre noe stort og komplekst, selv om lesbarheten til koden er sterkt redusert.
Avhengig av hvor mange verdier som returneres av underspørringer, endres området der de kan brukes. Det er tre alternativer totalt:
- Underspørringen returnerer én enkelt verdi (én kolonne og én rad).
- Underspørringen returnerer en liste med verdier (en tabell med én kolonne).
- Underspørringen returnerer en tabell (mange kolonner, et hvilket som helst antall rader).
La oss se på ett eksempel for hvert tilfelle.
Underspørring med skalært resultat
La oss finne en liste over alle våre ansatte fra ansatttabellen hvis lønn er høyere enn gjennomsnittet for selskapet. Hvordan kan vi gjøre det?
Vi kan enkelt filtrere ansatte ved å sammenligne lønnen deres med gjennomsnittet hvis vi vet det på forhånd. Samtidig har vi allerede skrevet en spørring som lar oss beregne gjennomsnittslønnen til selskapets ansatte. La oss huske det:
SELECT AVG(salary) FROM employee
Så returnerte MySQL oss verdien: 76833.3333 .
Hvordan nå finne en liste over alle ansatte som har lønn over gjennomsnittet? Det er også veldig enkelt:
SELECT * FROM employee
WHERE salary > 76833.3333
Resultatet av denne spørringen vil være:
id | Navn | okkupasjon | lønn |
---|---|---|---|
1 | Ivanov Ivan | Programmerer | 100 000 |
2 | Petrov Petr | Programmerer | 80 000 |
4 | Rabinovich Moisha | Regissør | 200 000 |
Og nå kombinerer vi bare begge forespørslene ved å erstatte den første forespørselen i stedet for verdien 76833:
SELECT * FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee)
Resultatet av denne spørringen vil være det samme:
id | Navn | okkupasjon | lønn |
---|---|---|---|
1 | Ivanov Ivan | Programmerer | 100 000 |
2 | Petrov Petr | Programmerer | 80 000 |
4 | Rabinovich Moisha | Regissør | 200 000 |
Underspørring med liste over verdier
Husker du en gang vi hadde en oppgave - å finne alle poster fra en tabell som det ikke finnes tilsvarende poster for fra en annen?
Det var også dette bildet:
Hvis jeg ikke tar feil, er oppgaven som følger: vis en liste over alle ansatte fra ansatttabellen som det ikke er noen oppgaver for i oppgavetabellen .
La oss også finne en løsning i to trinn.
La oss først skrive en spørring som vil returnere IDen til alle ansatte som har oppgaver i oppgavetabellen. Bare husk to ting:
- fjern duplikater – bruk DISTINCT nøkkelordet.
- fjern NULL-verdier fra resultatet.
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
Og her fikk vi et vakkert resultat av en slik forespørsel:
Ansatt ID |
---|
1 |
2 |
5 |
4 |
6 |
La oss midlertidig skrive det ned for enkelhets skyld som en sekvens: 1,2,5,4,6. La oss nå skrive en ny spørring - til ansatttabellen, som vil returnere en liste over ansatte hvis ID ikke er inkludert i den første listen:
SELECT * FROM employee
WHERE id NOT IN (1,2,5,4,6)
Og resultatet av denne spørringen:
id | Navn | okkupasjon | lønn | alder | join_date |
---|---|---|---|---|---|
3 | Ivanov Sergey | Tester | 40 000 | tretti | 2014-01-01 |
Og nå, som i forrige eksempel, kan du kombinere begge forespørslene ved ganske enkelt å erstatte brødteksten i den første forespørselen i stedet for id-listen.
SELECT * FROM employee
WHERE id NOT IN (
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
)
GO TO FULL VERSION