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 
   )