Базы данных
и язык SQL

Как применять операторы SQL INTERSECT и EXCEPT для пересечения и разности результатов запросов

Операции пересечения и разности множеств в SQL

Оператор SQL INTERSECT реализует операцию реляционной алгебры пересечение множеств, оператор SQL EXCEPT - разность множеств. В виде множеств выступают результаты единичных запросов.

Таким образом, оператор SQL INTERSECT возвращает те и только те строки, которые возвращает и первый, и второй запросы. В свою очередь, оператор SQL EXCEPT возвращает те строки, которые возвращает первый запрос, и которых нет среди строк, возвращаемых вторым запросом.

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

Оператор INTERSECT имеет следующий синтаксис:

SELECT ИМЕНА_СТОЛБЦОВ (1..N) FROM ИМЯ_ТАБЛИЦЫ INTERSECT SELECT ИМЕНА_СТОЛБЦОВ (1..N) FROM ИМЯ_ТАБЛИЦЫ

Оператор EXCEPT имеет следующий синтаксис:

SELECT ИМЕНА_СТОЛБЦОВ (1..N) FROM ИМЯ_ТАБЛИЦЫ EXCEPT SELECT ИМЕНА_СТОЛБЦОВ (1..N) FROM ИМЯ_ТАБЛИЦЫ

В этой конструкции единичные запросы могут иметь условия в секции WHERE, а могут не иметь их. При помощи операторов INTERSECT и EXCEPT можно производить операции с запросами как к одной таблице, так и к разным.

В примерах работаем с базой данных сети магазинов и таблицами SOLNYSHKO и VETEROK, содержащими данные о продуктах, которые имеются в магазинах с соответствующими названиями. Таблица SOLNYSHKO:

Prod_IDProdNameMakerQuantity
1хлебAB100
2молокоCD65
3мясоEF75
4рыбаGH60
5сахарIJ45

Таблица VETEROK:

Prod_IDProdNameMakerQuantity
1хлебQW85
2молокоLD70
3сырMV45
4маслоDG62
5рыбаLN55

Пересечение множеств: оператор SQL INTERSECT и его альтернативы

Пересечением множеств A и B называется множество, состоящее их всех тех или только тех элементов, которые принадлежат каждому из множеств A и B. Больше об операциях над множествами как над математическими объектами можно узнать из урока Множества и операции над множествами. Пересечениями множеств могут служить носители одних и тех же имен в двух студенческих группах, овощи одних и тех же наименований в двух корзинах и другие. Пересечением множеств является, наконец, набор товаров, которые имеются и в одном, и в другом магазинах.

Пример 1. Вывести список продуктов, которые имеются и в мазазине SOLNYSHKO, и в магазине VETEROK. Пишем следующий запрос с использованием оператора SQL INTERSECT:

SELECT ProdName FROM SOLNYSHKO INTERSECT SELECT ProdName FROM VETEROK

Результатом выполнения запроса будет следующая таблица:

ProdName
хлеб
молоко
рыба

Во многих диалектах SQL, например, MySQL, оператор INTERSECT отсутствует. Но реализация операции пересечения множеств возможна другими способами. Наиболее простой способ связан с использованием предиката EXISTS.

Пример 2. Вывести список продуктов, которые имеются и в мазазине SOLNYSHKO, и в магазине VETEROK. Использовать предикат SQL EXISTS. Пишем следующий запрос:

SELECT ProdName FROM SOLNYSHKO AS name_soln WHERE EXISTS (SELECT ProdName FROM VETEROK WHERE ProdName=name_soln.ProdName)

Результатом выполнения запроса будет та же таблица, что и в примере 1:

ProdName
хлеб
молоко
рыба

Разность множеств: оператор SQL EXCEPT и его альтернативы

Разностью множеств A и B называется множество состоящее из всех тех и только тех элементов множества A, которые не являются элементами множества B. В частности, такое множество может состоять из продуктов, которые имеются в одном из магазинов, но отсутствуют в другом магазине.

Пример 3. Вывести список продуктов, которые имеются в мазазине SOLNYSHKO, и отсутствуют в магазине VETEROK. Пишем следующий запрос с использованием оператора SQL EXCEPT:

SELECT ProdName FROM SOLNYSHKO EXCEPT SELECT ProdName FROM VETEROK

Результатом выполнения запроса будет следующая таблица:

ProdName
мясо
сахар

Во многих диалектах SQL, например, MySQL, оператор EXCEPT отсутствует. Наиболее простой альтернативный способ реализации разности множеств связан с использованием предиката EXISTS с отрицанием NOT, то есть NOT EXISTS.

Пример 4. Вывести список продуктов, которые имеются в мазазине SOLNYSHKO, и отсутствуют в магазине VETEROK. Использовать предикат SQL NOT EXISTS. Пишем следующий запрос:

SELECT ProdName FROM SOLNYSHKO AS name_soln WHERE NOT EXISTS (SELECT ProdName FROM VETEROK WHERE ProdName=name_soln.ProdName)

Результатом выполнения запроса будет та же таблица, что и в примере 2:

ProdName
мясо
сахар

Поделиться с друзьями

Реляционные базы данных и язык SQL