Аналогии между INTERSECT и EXISTS, EXCEPT и NOT EXISTS: более сложные примеры
Назад<<< | Содержание | Вперёд>>> |
Как оператор INTERSECT, так и предикат EXISTS выполняют операцию пересечения запросов. Они выбирают из двух запросов те записи, которые являются результатом выполнения и первого, и второго запросов.
Напротив, оператор EXCEPT и его аналог - предикат NOT EXISTS - извлекает те записи, которые есть в результатах первого запроса, и которых нет среди результатов второго запроса.
Для того, чтобы сработали названные выше предикаты и операторы, в запросах должны совпадать число столбцов, порядок их следования и имена.
Работаем с базой данных Mediastar, схема и содержание которой даны здесь.
Скачать архив со скриптом на SQL для установки этой базы со всеми данными можно по этой ссылке.
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.
Работаем с таблицами, показанными на рисунке ниже.

Пример 1. Вывести значения возраста всех пользователей, которые просматривали медиа (сайты) не только по теме "Обучение", но и по теме "Хобби". Использовать предикат EXISTS.
Задействованы все три таблицы, показанные на рисунке после вступления к уроку.
Запрос выполняет операцию пересечения множеств. Предикат EXISTS находится в секции WHERE в качестве второго условия после ключевого слова AND. Обратим особое внимание на то, что запросы с предикатом EXISTS - это коррелирующие запросы, то есть результат выполнения подзапроса зависит от результата выполнения основного запроса. Эта зависимость задаётся в подзапросе в секции WHERE в качестве второго условия: r2.Age=r1.Age, то есть значения возраста в запросе и подзапросе должны совпадать.
Запрос для выполнения этого задания должен быть таким:
В результате выполнения этого запроса будет выведена следующая таблица:

Пример 2. Как и в предыдущем задании, вывести значения возраста всех пользователей, которые просматривали медиа (сайты) не только по теме "Обучение", но и по теме "Хобби". Использовать оператор INTERSECT.
Оператор пересечения множеств INTERSECT располагается между двумя запросами, которые при этом совсем не требуется заключать в скобки. В отличие от EXISTS, использование INTERSECT не требует корреляции двух запросов.
Запрос для выполнения этого задания должен быть таким:
В результате выполнения этого запроса будет выведена следующая таблица:

Задания для самостоятельного решения
Пример 3. Вывести значения возраста пользователей, которые просматривали медиа (сайты) по теме "Обучение", но никогда по теме "Хобби". Использовать оператор EXCEPT.
Пример 4. Вывести значения возраста пользователей, которые просматривали медиа (сайты) по теме "Обучение", но никогда по теме "Хобби". Использовать предикат NOT EXISTS.
Поделиться с друзьями
Назад<<< | Содержание | Вперёд>>> |