Вложенные запросы

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Вложенным запросом (подзапросом) в SQL называется запрос, содержащийся в предложении WHERE или HAVING другого оператора SQL. Данный запрос обычно используется для получения данных из двух и более таблиц, а также для возвращения данных, которые будут использоваться в основном запросе, как условие для ограничения получаемых данных.

Типы вложенных запросов

[править | править код]
  • Вложенный запрос, возвращающий одно значение;
  • Вложенный запрос, возвращающий несколько значений;
  • Соотнесенный (коррелирующий) подзапрос.

Коррелируемым подзапросом называется подзапрос, который содержит ссылку на столбцы таблицы внешнего запроса.

Обработка вложенных запросов

[править | править код]

Простые вложенные подзапросы обрабатываются системой «снизу вверх». Первым обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации подзапроса более высокого уровня и т. д.

Коррелированные вложенные подзапросы обрабатываются системой в обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т. д., пока в результат не будут включены все строки, удовлетворяющие вложенному подзапросу (последовательности вложенных подзапросов).

Особенности вложенных запросов

[править | править код]
  • Вложенный запрос всегда заключается в круглые скобки;
  • Таблица результатов вложенного запроса всегда состоит из одного столбца;
  • Во вложенный запрос не может входить предложение ORDER BY.
  • Вложенный запрос не может заканчиваться в функции.
  • Вложенные запросы, возвращающие более одной записи, могут использоваться с операторами нескольких значений, как оператор IN.
  • Оператор BETWEEN не может быть использован вместе с вложенным запросом.
  • Подзапросы, представляющие собой тест на существование или присутствие данных, начинаются с EXISTS.

Вложенный запрос, возвращающий одно значение:

SELECT список_полей FROM имя_табл1
WHERE имя_поля1 = (SELECT имя_поля2 FROM имя_табл2 WHERE условие)

Вложенный запрос, возвращающий несколько значений:

SELECT список_полей FROM имя_табл1
WHERE имя_поля1 IN (SELECT имя_поля2 FROM имя_табл2 WHERE условие)

Соотнесенный (коррелирующий) подзапрос

SELECT список_полей FROM имя_табл1
WHERE имя_поля1 IN (SELECT имя_поля2 FROM имя_табл2 WHERE имя_табл1.поле=имя_табл2.поле)

Пример 1. Получить список предметов, по которым была получена оценка 4.

SELECT subjName
  FROM Subjects
  WHERE subjNum IN ( SELECT subjNum
    FROM Marks
    WHERE mark = 4)

Пример 2. Вывести список студентов, средний балл которых выше 4,5.

SELECT stName
  FROM Students
  WHERE (SELECT AVG(mark)
      FROM Marks
      WHERE Marks.stNum = Students.stNum) > 4.5

Литература

[править | править код]
  • Мартин Грубер «Понимание SQL» (2006)
  • Алан Бьюли «Изучаем SQL» (2007)
  • Грофф, Джеймс; Вайнберг « Пол SQL: полное руководство» (2005)