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

Вложенная команда SELECT выполняется первой. Результат передается в условие главного запроса. Первой выполняется команда SELECT вложенного блока запроса. Далее обрабатывается главный блок запроса. Результат подзапроса используется при этом для вычисления условия поиска.

Пример 1. Выборка фамилий и должностей сотрудников, имеющих такой же стаж, как у сотрудника Иванова (таблица Prep).

SELECT fam, dolzhn

FROM Prep

WHERE stash =

(SELECT stash

FROM Prep

WHERE fam = ‘Иванов’);

Однострочные и многострочные подзапросы.

По количеству возвращаемых строк, удовлетворяющих условию запроса, подзапросы делятся на:

- Однострочные – подзапросы, где в качестве операторов сравнения могут быть использованы (>,=,>=,<,<>,<=).

- Многострочные – подзапросы,в которых используется только оператор IN (NOT IN).

Однострочный подзапрос возвращает из вложенной команды SELECT только одну строку. В подзапросах этого типа используется однострочный оператор сравнения.

Можно выводить данные из основного запроса, используя групповую функцию в подзапросе для возврата одной строки. Групповая функция AVG возвращает единственное значение.

Пример 2. Вывод фамилии и должности всех преподавателей со стажем выше минимального.

SELECT fam, dolzhn

FROM Prep

WHERE stash>

(SELECT MIN(stash)

FROM Prep);

Многострочные подзапросы.

Подзапросы, возвращающие более одной строки, называются многострочными. В них следует использовать многострочный оператор сравнения (например, IN), т.к. подзапрос возвращает список значений.

Пример 3. Вывод списка служащих, приписанных к финансовому отделу или региону 2.

SELECT fam_cotr, name_otdel

FROM Emp

WHERE id_otdel IN (SELECT id_otdel

FROM Sveden

WHERE name_otdel = ‘Финансовый’ OR id_region = 2);

Подзапросы можно использовать не только в предложении WHERE, но и в предложении HAVING. При этом подзапросы выполняются первыми и результаты возвращаются в предложение HAVING главного запроса.

Пример 4. Вывод всех отделов, в которых средняя зарплата выше, чем в финансовом отделе.

SELECT name_otdel, AVG(salary)

FROM EMP

GROUP BY name_otdel

HAVING AVG(salary)> (SELECT AVG(salary)

FROM emp

WHERE name_otdel = ‘Финансовый’);

Тема 10: Выборка данных из нескольких таблиц.

Простой запрос с соединением.

Псевдонимы таблиц.

Дополнительные условия поиска.

Внешние соединения.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: