[Disclaimer: Данная статья была переведена в рамках "Конкурса на лучший перевод статьи" на сервисе Quizful. Ссылка на оригинал находится внизу страницы.]
Подзапросы, внутренние или вложенные запросы – есть не что иное, как запрос внутри запроса. Обычно, подзапрос используется в конструкции WHERE. И, в большинстве случаев, подзапрос используется, когда вы можете получить значение с помощью запроса, но не знаете конкретного результата.
Подзапросы являются альтернативным путем получения данных из множества таблиц.
Наряду с операторами сравнения такими, как =, <, >, >=, <= и др., Вы можете использовать подзапросы с перечисленными ниже конструкциями:
- SELECT
- INSERT
- UPDATE
- DELETE
Примеры подзапросов
1)Обычно, подзапрос возвращает только одну запись, но случается и так, что записей может быть много, тогда в условии WHERE используются такие операторы, как IN, NOT IN. Запрос может выглядеть следующий образом:
SELECT first_name, last_name, subject
FROM student_details
WHERE games NOT IN ('Cricket', 'Football'); Тогда результат будет примерно таким:
first_name last_name games
------------ ----------- ----------
Shekar Gowda Badminton
Priya Chandra Chess2)Давайте рассмотрим используемую ранее таблицу student_details. Если Вы знаете имена студентов, изучающих естествознание (science), то можете получить их id, используя приведенный ниже запрос
SELECT id, first_name
FROM student_details
WHERE first_name IN ('Rahul', 'Stephen'); но, если Вы не знаете их имен, то для получения id Вам необходимо написать запрос, описанным ниже способом:
SELECT id, first_name
FROM student_details
WHERE first_name IN (SELECT first_name
FROM student_details
WHERE subject= 'Science'); Результат:
Id first_name
-------- -------------
100 Rahul
102 Stephen
В описанном выше запросе, вначале выполняется внутренний запрос, затем внешний
3) Вы можете использовать подзапрос с оператором INSERT для добавления данных из одной таблицы в другую. Давайте попробуем сгруппировать всех студентов, которые изучают математику в таблицу math_group
INSERT INTO maths_group(id, name)
SELECT id, first_name || ' ' || last_name
FROM student_details WHERE subject= 'Maths' 4) Подзапрос может использоваться с оператором SELECT, как описано ниже. Давайте используем таблицы product и order_items, объединив их между собой
select p.product_name,
p.supplier_name,
(select order_id from order_items where product_id = 101) as order_id
from product p
where p.product_id = 101product_name supplier_name order_id
-------------- -------------- ----------
Television Onida 5103Соотнесенный подзапрос
Запрос называется соотнесенным, когда оба, и внутренний, и внешний, запросы взаимозависимы. Это означает, что для обработки каждой записи внутреннего запроса, должна быть получена также запись внешнего запроса, т.е. внутренний запрос всецело зависит от внешнего.
SELECT p.product_name FROM product p
WHERE p.product_id = (SELECT o.product_id FROM order_items o
WHERE o.product_id = p.product_id); Примечание:
1) Вы можете использовать столько вложенных запросов, сколько захотите, но в Oracle не рекомендуется использовать более 16 вложений.
2) Если подзапрос не зависит от внешнего запроса – он называется несоотнесенным подзапросом
----------
Оригинальный текст статьи: SQL Subquery