Русская Википедия:Вложенные запросы

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Вложенным запросом (подзапросом) в 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)

Шаблон:Изолированная статья