Подзаявката е команда SELECT, вложена в SELECT, SELECT... В, ВМЪКВАНЕ... КОМАНДА INTO, DELETE или UPDATE или в друга подзаявка.
Синтаксис
Можете да използвате три форми на синтаксис, за да създадете подзаявка:
сравнение [ANY | ВСИЧКИ | SOME] (sqlstatement)
израз [NOT] IN (sql_команда)
[НЕ] [НЯМА] EXISTS (sql_команда)
Подзаявката има следните части:
Част |
Описание |
Сравнение |
Оператор за израз и оператор за сравнение, който сравнява израза с резултатите от подзаявката. |
израз |
Израз, за който се търси наборът от резултати на подзаявката. |
sql_инструкция |
Команда SELECT, следваща същия формат и правила като всяка друга команда SELECT. То трябва да е оградено в скоби. |
Забележки
Можете да използвате подзаявка вместо израз в списъка с полета на команда SELECT или в клауза WHERE или HAVING. В подзаявка използвате команда SELECT, за да предоставите набор от една или повече конкретни стойности за оценяване в израза на клаузата WHERE или HAVING.
Използвайте предиката ANY или SOME, които са синоними, за да извлечете записи в основната заявка, които удовлетворяват сравнението с всички записи, извлечени в подзаявката. Следващият пример връща всички продукти, чиято единична цена е по-голяма от тази на всеки продукт, продаден с отстъпка от 25 процента или повече:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Използвайте предиката ALL, за да извлечете само тези записи в основната заявка, които удовлетворяват сравнението с всички записи, извлечени в подзаявката. Ако сте променили ANY на ALL в предишния пример, заявката ще върне само тези продукти, чиято единична цена е по-голяма от тази на всички продукти, продадени с отстъпка от 25 процента или повече. Това е много по-ограничаващо.
Използвайте предиката IN, за да извлечете само тези записи в основната заявка, за които някои записи в подзаявката съдържат еднаква стойност. Следващият пример връща всички продукти с отстъпка от 25 процента или повече:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Обратно, можете да използвате NOT IN, за да извлечете само тези записи в основната заявка, за които нито един запис в подзаявката не съдържа еднаква стойност.
Използвайте предиката EXISTS (с незадължителната запазена дума NOT) в сравнения "истина/неистина", за да определите дали подзаявката връща записи.
Можете също да използвате псевдоними на имена на таблици в подзаявка, за да препращате към таблици, изброени в клауза FROM извън подзаявката. Следващият пример връща имената на наетите лица, чиито заплати са равни на или по-големи от средната заплата на всички служители с еднаква длъжност. На таблицата Employees се дава псевдонимът "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;
В предишния пример as запазена дума е незадължително.
Някои подзаявки са разрешени в кръстосани заявки – по-конкретно като предикати (тези в клаузата WHERE). Подзаявките като изход (тези в списъка SELECT) не са разрешени в кръстосани заявки.