Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инф.сис_вместе..doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.8 Mб
Скачать

Составные запросы с несколькими подзапросами.

Пример. Составить список сотрудников, должность которых совпадает с должностью сотрудника Реброва или получающих столько же или более чем сотрудник Данин:

SELECT Оклад, Должность, Фамилия

FROM Сотрудники

WHERE Должность = ANY(SELECT Должность

FROM Сотрудники WHERE Фамилия = ‘Ребров’

OR Оклад >= ALL (SELECT Должность

FROM Сотрудники WHERE Фамилия = ‘Данин’)

ORDER BY Должность, Оклад

Пример. Найти фамилию и занимаемую должность всех сотрудников отдела 10, должность которых совпадает с должностью какого-либо сотрудника отдела торговли:

SELECT Должность, Фамилия

FROM Сотрудники

WHERE Должность IN (SELECT Должность

FROM Отелы, Сотрудники

WHERE Назв_отдела = ‘Торговля’ and

Сотрудники.Отдел = Отделы.Отдел)

Синхронизация повторяющихся подзапросов

Предположим, нужно найти номер отдела, фамилию и оклад сотрудников, зарабатывающих больше среднего оклада в своем отделе.

Select Отдел, Фамилия, Оклад

From Сотрудники S

Where Оклад > (Select AVG (оклад)

From Сотрудники

Where отдел = S.отдел)

В данном случае, для каждой строки первый запрос будет вложенным.

Такой механизм называется синхронизацией повторяющегося подзапроса. Псевдоним таблицы, определенный в основном запросе и встречающийся во вложенном подзапросе, сообщает СУБД о необходимости синхронизации подзапроса с основным запросом.

Последовательность действий СУБД при обработке вложенного подзапроса с синхронизацией:

В основном запросе извлекается очередная строка.

Номер отдела из этой строки передается во вложенный подзапрос и используется вместо S.отдел.

Выполняется вложенный подзапрос, который вычисляет среднюю зарплату для заданного отдела.

Средний оклад передается в основной запрос и используется в предложении Where.

Пример использования подзапросов с условием соединения.

Найти данные о сотрудниках, работающих в Твери, должность которых такая же, как у Евдокимова:

Select Фамилия, Оклад, Должность, Город

From Сотрудники, Отделы

Where Город = «Тверь» AND

Сотрудники.отдел = Отделы.отдел AND

Должность = ANY (Select Должность

From Сотрудники

Where Фамилия = “Евдокимов”)

ORDER BY Фамилия

Комбинация нескольких команд Select

Запросы и подзапросы могут комбинироваться из нескольких команд Select с помощью операторов:

UNION – объединение.

Результат выполнения – не дублирующиеся записи, полученные в результате первого и второго запроса.

INTERSECT – пересечение.

Результат – записи, полученные как в первом, так и во втором запросах.

EXCEPT

Результат – записи, извлеченные в первом запросе за исключением записей, полученных во втором запросе.

Пример. Выдать сотрудников с фамилией Иванов и получающих больше, чем 100 рублей:

Select Фамилия, Оклад

From Сотрудники

Where Фамилия = ‘Иванов’

UNION

Select Фамилия, Оклад

From Сотрудники

Where Оклад > 100

Замечание:

Результирующие таблицы объединяемых запросов должны быть совместимы, т.е. иметь одинаковое количество столбцов и одинаковые типы столбцов в порядке их перечисления.

Не требуется, чтобы объединяемые таблицы имели одинаковые имена колонок.

Наименования колонок в результирующем запросе будут автоматически взяты из результатов первого запроса.