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