En underfråga är ett SELECT-uttryck kapslat i en SELECT, SELECT... INTO, INSERT... INTO-, DELETE- eller UPDATE-instruktionen eller inuti en annan underfråga.
Syntax
Du kan använda tre former av syntax för att skapa en underfråga:
jämförelse [ANY | ALLA | SOME] (sqlstatement)
uttryck [ICKE] IN (sqlstatement)
[ICKE] EXISTS (sqlstatement)
En underfråga består av följande delar:
Element |
Beskrivning |
Jämförelse |
En uttryck och en jämförelseoperator som jämför uttrycket med resultatet av underfrågan. |
uttryck |
Ett uttryck som underfrågans resultatuppsättning genomsöks för. |
sql-instruktion |
Ett SELECT-uttryck som följer samma format och regler som andra SELECT-uttryck. Den måste omges av parenteser. |
Kommentarer
Du kan använda en underfråga i stället för ett uttryck i fältlistan för ett SELECT-uttryck eller i en WHERE- eller HAVING-sats. I en underfråga använder du ett SELECT-uttryck för att ange en uppsättning med ett eller flera specifika värden som ska utvärderas i WHERE- eller HAVING-satsuttrycket.
Använd predikatet ANY eller SOME, som är synonymt, för att hämta poster i huvudfrågan som uppfyller jämförelsen med alla poster som hämtats i underfrågan. I följande exempel returneras alla produkter vars enhetspris är större än för en produkt som säljs till en rabatt på 25 procent eller mer:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Använd predikatet ALL till att endast hämta de poster i huvudfrågan som uppfyller jämförelsen med alla poster som hämtats i underfrågan. Om du ändrade ANY till ALL i föregående exempel returnerar frågan endast de produkter vars enhetspris är större än för alla produkter som säljs med en rabatt på 25 procent eller mer. Detta är mycket mer restriktivt.
Använd predikatet IN för att endast hämta de poster i huvudfrågan som vissa poster i underfrågan innehåller ett likhetsvärde för. I följande exempel returneras alla produkter med en rabatt på 25 procent eller mer:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Däremot kan du använda NOT IN för att endast hämta de poster i huvudfrågan som ingen post i underfrågan innehåller ett lika värde för.
Använd predikatet EXISTS (med det valfria ICKE-reserverade ordet) i sant/falskt-jämförelser för att avgöra om underfrågan returnerar några poster.
Du kan också använda tabellnamnalias i en underfråga för att referera till tabeller som anges i en FROM-sats utanför underfrågan. I följande exempel returneras namnen på anställda vars löner är lika med eller högre än den genomsnittliga lönen för alla anställda som har samma befattning. Tabellen Anställda har aliaset "T1":
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
I föregående exempel är AS- reserverat ord valfritt.
Vissa underfrågor är tillåtna i korsfrågor – specifikt som predikat (de i WHERE-satsen). Underfrågor som utdata (de i SELECT-listan) är inte tillåtna i korsfrågor.