Часто невозможно решить поставленную задачу с помощью одного запроса. В этом случае используют подзапросы (внутренние, вложенные запросы).
Подзапрос представляет собой оператор SELECT, вложенный в тело другого оператора. Кодирование подзапроса подчиняется тем же правилам, что и кодирование простого оператора SELECT. Внешний оператор использует результат выполнения внутреннего оператора для определения окончательного результата.
По количеству возвращаемых значений подзапросы разделяются на два типа:
- скалярные подзапросы, которые возвращают единственное значение;
- табличные подзапросы, которые возвращают множество значений.
По способу выполнения выделяют два типа подзапросов:
- простые подзапросы;
- сложные подзапросы.
Подзапрос называется простым, если он может рассматриваться независимо от внешнего запроса. СУБД выполняет такой подзапрос один раз и затем помещает его результат во внешний запрос.
Сложный подзапрос не может рассматриваться независимо от внешнего запроса. В этом случае выполнение оператора начинается с внешнего запроса, который отбирает каждую отдельную строку таблицы. Для каждой выбранной строки СУБД выполняет подзапрос один раз.
Пример. Определить номера деталей, цена которых меньше средней цены деталей.
- SELECT dnum
- FROM D
- WHERE dprice<(SELECT AVG(dprice)
- FROM D)
Подзапросы, внутренние или вложенные запросы – есть не что иное, как запрос внутри запроса. Обычно, подзапрос используется в конструкции WHERE. И, в большинстве случаев, подзапрос используется, когда вы можете получить значение с помощью запроса, но не знаете конкретного результата.
Подзапросы являются альтернативным путем получения данных из множества таблиц.
Наряду с операторами сравнения такими, как =, <, >, >=, <= и др., Можно использовать подзапросы с перечисленными ниже конструкциями:
- SELECT
- INSERT
- UPDATE
- DELETE
Обычно, подзапрос возвращает только одну запись, но случается и так, что записей может быть много, тогда в условии WHERE используются такие операторы, как IN, NOT IN.
Оператор SQL IN позволяет определить, совпадает ли значение объекта со значением в списке.
Операторы ANY и ALL используются с предложением WHERE или HAVING. ANY оператор возвращает true, если какое-либо из значений подзапроса удовлетворяет условию. Оператор ALL возвращает true, если все значения подзапроса удовлетворяют условию.