SQL Server-forespørgsel
Oversigt: I denne vejledning lærer du om SQL Server-underforespørgsel, og hvordan du bruger underforespørgslen til forespørgsel på data. > Introduktion til SQL Server-underforespørgsel
En underforespørgsel er en forespørgsel, der er indlejret i en anden sætning såsom SELECT
, INSERT
, UPDATE
eller DELETE
.
Lad os se følgende eksempel.
Overvej orders
og customers
tabeller fra eksempeldatabasen.
Følgende udsagn viser, hvordan du bruger en underforespørgsel i WHERE
-sætningen til en SELECT
erklæring for at finde salgsordrer fra de kunder, der finder i New York
:
Her er resultatet:
I dette eksempel er følgende udsagn en underforespørgsel:
Code language: SQL (Structured Query Language) (sql)
Bemærk, at du altid skal vedlægge SELECT
forespørgsel om en underforespørgsel i parentes ()
.
En underforespørgsel kaldes også en indre forespørgsel eller indre markering, mens udsagnet, der indeholder underforespørgslen, kaldes en ydre valg eller ydre forespørgsel:
SQL Server udfører hele forespørgselseksemplet ovenfor som følger:
Først udfører den underforespørgslen for at få en liste over kundeidentifikationsnumre på de kunder, der finder i New York
.
Code language: SQL (Structured Query Language) (sql)
For det andet erstatter SQL Server kundeidentifikationsnumre, der returneres af underforespørgslen i IN
-operatoren og udfører den ydre forespørgsel for at få det endelige resultatsæt.
Som du kan s ee, ved at bruge underforespørgslen kan du kombinere to trin sammen. Underforespørgslen fjerner behovet for at vælge kundeidentifikationsnumre og tilslutte dem til den ydre forespørgsel. Desuden tilpasser selve forespørgslen automatisk, hver gang kundedataene ændres.
Indlejrende underforespørgsel
En underforespørgsel kan indlejres i en anden underforespørgsel. SQL Server understøtter op til 32 niveauer af indlejring. Overvej følgende eksempel:
Først, SQL Server udfører følgende underforespørgsel for at få en liste over mærkeidentifikationsnumre for mærkerne Strider
og Trek
:
For det andet beregner SQL Server den gennemsnitlige prisliste for alle produkter, der hører til til disse mærker.
Code language: SQL (Structured Query Language) (sql)
For det tredje finder SQL Server de produkter, hvis listepris er højere end den gennemsnitlige listepris for alle produkter med Strider
eller Trek
brand.
SQL Server-underforespørgselstyper
Du kan bruge en underforespørgsel mange steder:
- I stedet for et udtryk
- Med
IN
ellerNOT IN
- Med
ANY
ellerALL
- Med
EXISTS
ellerNOT EXISTS
- I
UPDATE
,DELETE
, ellerINSERT
udsagn - I
FROM
-sætningen
SQL Server-underforespørgsel bruges i stedet for et udtryk
Hvis en underforespørgsel returnerer en enkelt værdi, kan den bruges hvor som helst et udtryk bruges.
I det følgende eksempel bruges en underforespørgsel som en kolonneudtryk med navnet max_list_price
i en SELECT
udsagn.
SQL Server-underforespørgsel bruges med IN-operator
En underforespørgsel, der bruges med IN
returnerer et sæt med nul eller flere værdier. Når underforespørgslen har returneret værdier, bruger den ydre forespørgsel dem.
Den følgende forespørgsel finder navnene på alle mountainbikes og landevejscykler, som cykelbutikkerne sælger.
Denne forespørgsel evalueres i to trin:
- Først returnerer den indre forespørgsel en liste over kategoriidentifikationsnumre, der matcher navnene
Mountain Bikes
ogcode
Road Bikes. - For det andet erstattes disse værdier i den ydre forespørgsel, der finder produktnavne, der har kategoriidentifikationsnummeret, svarer til en af værdierne på listen.
SQL Server-underforespørgsel bruges med ALLE operatører
Underforespørgslen introduceres med ANY
operatøren har følgende syntaks:
Code language: SQL (Structured Query Language) (sql)
Forudsat at underforespørgslen returnerer en liste med værdi v1, v2,… vn. ANY
operatøren returnerer TRUE
hvis en af et sammenligningspar (scalar_expression
, vi) evaluerer til TRUE
; Ellers returnerer den FALSE
.
F.eks. finder følgende forespørgsel produkter, hvis listepriser er større end eller lig med den gennemsnitlige listepris for et produktmærke .
For hvert mærke, underforespørgslen finder den maksimale listepris. Den ydre forespørgsel bruger disse maksimale priser og bestemmer, hvilket enkelt produkts listepris er større end eller lig med ethvert brands maksimale listepris.
SQL Server-forespørgsel bruges med ALL-operatør
ALL
operator har samme syntaks som ANY
operator:
Code language: SQL (Structured Query Language) (sql)
ALL
operatoren returnerer TRUE
hvis alle sammenligningspar (scalar_expression
, vi) vurderes til TRUE
; Ellers returnerer den FALSE
.
Følgende forespørgsel finder de produkter, hvis listepris er større end eller lig med den gennemsnitlige listepris, der returneres af underforespørgslen:
SQL Server-underforespørgsel bruges med EXISTS eller NOT EKSISTER
Følgende illustrerer syntaksen for en underforespørgsel introduceret med EXISTS
operator:
Code language: SQL (Structured Query Language) (sql)
EXISTS
operatøren returnerer TRUE
, hvis resultatet af underforespørgslen resulterer; ellers returnerer den FALSE
.
På den anden side er NOT EXISTS
modsat EXISTS
-operatør.
Følgende forespørgsel finder de kunder, der købte produkter i 2017:
Hvis du bruger NOT EXISTS
i stedet for EXISTS
, du kan finde de kunder, der ikke købte nogen produkter i 2017.
SQL Server-underforespørgsel i FROM-klausulen
Antag, at du vil finde gennemsnittet af summen af ordrer for alle sælgere. For at gøre dette kan du først finde antallet af ordrer efter stabe:
Derefter kan du anvende AVG()
-funktionen til dette resultatsæt. Da en forespørgsel returnerer et resultatsæt, der ligner en virtuel tabel, kan du placere hele forespørgslen i FROM
-sætningen i en anden forespørgsel som denne:
Forespørgslen, du placerer i FROM
klausul skal have et tabelalias. I dette eksempel brugte vi t som tabelalias for underforespørgslen. For at komme med det endelige resultat udfører SQL Server følgende trin:
- Udfør underforespørgslen i
FROM
-klausulen. - Brug resultatet af underforespørgslen, og udfør den ydre forespørgsel.
I denne vejledning har du lært om SQL Server-underforespørgselskonceptet, og hvordan man bruger forskellige underforespørgselstyper til at forespørge data.