A subquery egy SELECT utasítás, amely egy SELECT, SELECT... INTO, INSERT... INTO, DELETE vagy UPDATE utasítást, vagy egy másik alkérdezésen belül.
Szintaxis
A szintaxis három formája használható a segéd lekérdezések létrehozásához:
összehasonlítás [ANY | ALL | SOME] (sqlstatement)
kifejezés [NOT] IN (sqlstatement)
[NEM] EXISTS (sqlstatement)
Az al lekérdezések a következő részekből állnak:
Rész |
Leírás |
Összehasonlítás |
Egy kifejezés és egy összehasonlító operátor, amely összehasonlítja a kifejezést a segéd lekérdezés eredményeivel. |
kifejezés |
Egy kifejezés, amelyben a rendszer megkeresi az alkérdezés eredményhalmazát. |
sqlutasítás |
EGY SELECT utasítás, amely ugyanazt a formátumot és szabályokat követi, mint bármely más SELECT utasítás. Zárójelek közé kell tenni. |
Megjegyzések
A SELECT utasítás mezőlistájában, illetve a WHERE vagy HAVING záradékban kifejezés helyett segéd lekérdezést is használhat. A segéd lekérdezésekben a SELECT utasítással megadhat egy vagy több konkrét értéket a WHERE vagy HAVING záradék kifejezésben kiértékelendő értékekből.
A szinonima any vagy SOME predikátum használatával lekérheti a fő lekérdezés azon rekordjait, amelyek megfelelnek a segéd lekérdezésben lekért rekordok összehasonlításának. Az alábbi példa az összes olyan terméket adja vissza, amelynek egységára nagyobb, mint bármely 25%-os vagy annál nagyobb kedvezménnyel értékesített terméké:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Az ALL predikátum használatával csak azokat a rekordokat kérje le a fő lekérdezésben, amelyek megfelelnek a segéd lekérdezésben lekért összes rekord összehasonlításának. Ha az előző példában az ANY értéket ALL értékre módosította, a lekérdezés csak azokat a termékeket adja vissza, amelyek egységára nagyobb, mint az összes 25%-os vagy annál nagyobb kedvezménnyel értékesített terméké. Ez sokkal korlátozóbb.
Az IN predikátum használatával csak azokat a rekordokat kérje le a fő lekérdezésben, amelyekhez a segéd lekérdezés egy rekordja egyenlő értéket tartalmaz. Az alábbi példa az összes 25%-os vagy annál nagyobb kedvezményt tartalmazó terméket adja vissza:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Ezzel szemben a NOT IN használatával csak azokat a rekordokat kérdezheti le a fő lekérdezésben, amelyeknél a segéd lekérdezés egyetlen rekordja sem tartalmaz egyenlő értéket.
Használja a EXISTS predikátumot (a nem kötelező NOT fenntartott szóval) igaz/hamis összehasonlításokban annak megállapításához, hogy a segéd lekérdezés visszaad-e rekordokat.
A segéd lekérdezésekben táblanév-aliasokat is használhat, hogy a segéd lekérdezésen kívüli FROM záradékban felsorolt táblákra hivatkozzon. Az alábbi példa azoknak az alkalmazottaknak a nevét adja vissza, akiknek a fizetése egyenlő vagy nagyobb, mint az azonos beosztású alkalmazottak átlagkeresete. Az Employees tábla "T1" aliast kap:
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
Az előző példában az AS foglalt szó nem kötelező megadni.
A kereszttáblás lekérdezésekben bizonyos segéd lekérdezések engedélyezve vannak– konkrétan predikátumokként (a WHERE záradékban lévők). A helyettesítő lekérdezések kimenetként (a SELECT listában lévők) nem engedélyezettek a kereszttáblás lekérdezésekben.