Підзапит – це оператор SELECT, вкладений у select, SELECT... INTO, INSERT... Оператор INTO, DELETE, UPDATE або всередині іншого підзапиту.
Синтаксис
Щоб створити підзапит, можна скористатися трьома формами синтаксису:
порівняння [ANY | УСІ | SOME] (sqlstatement)
вираз [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
Підзапит містить такі частини:
Частина |
Опис |
Порівняння |
вираз та оператор порівняння, який порівнює вираз із результатами підзапиту. |
вираз |
Вираз, для якого шукається набір результатів підзапиту. |
sqlstatement |
Оператор 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) у порівняннях зі значенням true/false, щоб визначити, чи повертає підзапит будь-які записи.
Псевдоніми імен таблиць також можна використовувати в підзапиті, щоб посилатися на таблиці, перелічені в реченні FROM поза підзапитом. У наведеному нижче прикладі повертаються імена працівників, заробітна плата яких дорівнює або більша за середню заробітну плату всіх працівників, які мають однакову посаду. Таблиці "Працівники" надано псевдонім "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) не можна використовувати в перехресних запитах.