SQL Server-underfråga
Sammanfattning: i denna handledning lär du dig om SQL Server-underfrågan och hur du använder underfrågan för att fråga data.
Introduktion till SQL Server-underfråga
En underfråga är en fråga kapslad i ett annat uttalande som SELECT
, INSERT
, UPDATE
, eller DELETE
.
Låt oss se följande exempel.
Tänk på orders
och customers
tabeller från exempeldatabasen.
Följande uttalande visar hur man använder en underfråga i WHERE
-satsen i en SELECT
uttalande för att hitta kundorder som hittar i New York
:
Här är resultatet:
I detta exempel är följande uttalande en underfråga:
Code language: SQL (Structured Query Language) (sql)
Observera att du alltid måste bifoga SELECT
fråga om en underfråga inom parentes ()
.
En underfråga kallas också en inre fråga eller inre markering medan uttalandet som innehåller underfrågan kallas en yttre markering eller yttre fråga:
SQL Servern kör hela frågeexemplet ovan enligt följande:
Först körs underfrågan för att få en lista över kundidentifieringsnummer för de kunder som hittar i New York
.
Code language: SQL (Structured Query Language) (sql)
För det andra ersätter SQL Server kundidentifieringsnummer som returneras av underfrågan i operatören IN
och kör den yttre frågan för att få den slutliga resultatuppsättningen.
Som du kan s ee, genom att använda underfrågan kan du kombinera två steg tillsammans. Underfrågan tar bort behovet av att välja kundidentifieringsnummer och ansluta dem till den yttre frågan. Dessutom justerar själva frågan automatiskt när kunddata ändras.
Nestande underfråga
En underfråga kan kapslas i en annan underfråga. SQL Server stöder upp till 32 nivåer av kapsling. Tänk på följande exempel:
Först, SQL Server kör följande underfråga för att få en lista över varumärkesidentifieringsnummer för varumärkena Strider
och Trek
:
För det andra beräknar SQL Server den genomsnittliga prislistan för alla produkter som tillhör till dessa märken.
Code language: SQL (Structured Query Language) (sql)
För det tredje hittar SQL Server de produkter vars listpris är högre än det genomsnittliga listpriset för alla produkter med Strider
eller Trek
varumärke.
SQL Server-underfrågetyper
Du kan använda en underfråga på många ställen:
- I stället för ett uttryck
- Med
IN
ellerNOT IN
- Med
ANY
ellerALL
- Med
EXISTS
ellerNOT EXISTS
- I
UPDATE
,DELETE
, ellerINSERT
uttalande - I
FROM
-satsen
SQL Server-underfrågan används istället för ett uttryck
Om en underfråga returnerar ett enda värde kan den användas var som helst ett uttryck används.
I följande exempel används en underfråga som kolumnuttryck med namnet max_list_price
i ett SELECT
uttalande.
SQL Server-underfråga används med IN-operatör
En underfråga som används med IN
returnerar en uppsättning med noll eller fler värden. Efter att underfrågan har returnerat värden använder den yttre frågan dem.
Följande fråga hittar namnen på alla mountainbikes och roadcykelprodukter som cykelbutikerna säljer.
Denna fråga utvärderas i två steg:
- Först returnerar den inre frågan en lista över kategoriidentifieringsnummer som matchar namnen
Mountain Bikes
ochcode
Vägcyklar. - För det andra ersätts dessa värden i den yttre frågan som hittar produktnamnen som har kategoriidentifieringsnumret som matchar ett av värdena i listan.
SQL Server-underfrågan används med ALLA operatörer
Underfrågan introduceras med ANY
operatören har följande syntax:
Code language: SQL (Structured Query Language) (sql)
Förutsatt att underfrågan returnerar en lista med värdet v1, v2,… vn. ANY
-operatören returnerar TRUE
om en av ett jämförelsepar (scalar_expression
, vi) utvärderar till TRUE
; annars returnerar den FALSE
.
Till exempel hittar följande fråga de produkter vars listpriser är högre än eller lika med det genomsnittliga listpriset för något produktmärke .
För varje märke, underfrågan hittar det högsta listpriset. Den yttre frågan använder dessa maxpriser och bestämmer vilken enskild produkts listpris som är större än eller lika med varumärkets maximala listpris.
SQL Server-underfrågan används med ALL-operatören
ALL
operatör har samma syntax som ANY
operatör:
Code language: SQL (Structured Query Language) (sql)
ALL
-operatören returnerar TRUE
om alla jämförelsepar (scalar_expression
, vi) utvärderas till TRUE
; annars returnerar den FALSE
.
Följande fråga hittar de produkter vars listpris är större än eller lika med det genomsnittliga listpris som returneras av underfrågan:
SQL Server-underfrågan används med EXISTS eller NOT EXISTER
Följande illustrerar syntaxen för en underfråga introducerad med EXISTS
operatör:
Code language: SQL (Structured Query Language) (sql)
EXISTS
-operatören returnerar TRUE
om underfrågan returnerar; annars returnerar den FALSE
.
Å andra sidan är NOT EXISTS
motsatt EXISTS
operatör.
Följande fråga hittar de kunder som köpte produkter 2017:
Om du använder NOT EXISTS
istället för EXISTS
, du hittar de kunder som inte köpte några produkter 2017.
SQL Server-underfråga i FROM-klausulen
Antag att du vill hitta genomsnittet av summan av order för alla säljare. För att göra detta kan du först hitta antalet beställningar av personal:
Sedan kan du använda funktionen AVG()
på den här resultatuppsättningen. Eftersom en fråga returnerar en resultatuppsättning som ser ut som en virtuell tabell kan du placera hela frågan i FROM
-satsen i en annan fråga så här:
Frågan som du placerar i FROM
paragraf måste ha ett tabellalias. I det här exemplet använde vi t som tabellalias för underfrågan. För att komma med slutresultatet utför SQL Server följande steg:
- Kör underfrågan i
FROM
-satsen. - Använd resultatet av underfrågan och kör den yttre frågan.
I denna handledning har du lärt dig om SQL Server-underfrågekonceptet och hur du använder olika underfrågetyper för att fråga data.