Вложенная команда 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: Выборка данных из нескольких таблиц.
Простой запрос с соединением.
Псевдонимы таблиц.
Дополнительные условия поиска.
Внешние соединения.