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

Навигация по уроку

  • Операции пересечения и разности множеств в SQL
  • Пересечение множеств: оператор SQL INTERSECT и его альтернативы
  • Разность множеств: оператор SQL EXCEPT и его альтернативы
Связанные темы

  • Оператор SELECT
  • Реляционная алгебра и её операции
НазадСодержаниеВперёд>>>

Оператор 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

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

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

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке

.

Скрипт для создания базы данных магазинов, её таблиц и заполения таблиц данными — в файле по этой ссылке.

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

SELECT ProdName FROM Solnyshko INTERSECT SELECT ProdName FROM Veterok

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

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

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

Пример 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
хлеб
молоко
рыба
  • Аналогии между INTERSECT и EXISTS, EXCEPT и NOT EXISTS: более сложные примеры

Разностью множеств 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. В качестве альтернативы им можно пользоваться и в MS SQL Server.

Пример 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
мясо
сахар
  • Аналогии между INTERSECT и EXISTS, EXCEPT и NOT EXISTS: более сложные примеры

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

НазадСодержаниеВперёд>>>

SQL — Класс EXCEPT

Класс/оператор EXCEPT в SQL используется для объединения два запроса SELECT и возвращает строку из первого SELECT, которых нет во вторым SELECT. Это означает, что UNION возвращает только те строки, которые не доступны во втором SELECT.

Так же, как с оператором UNION, одни и те же правила применяются при использовании оператора EXCEPT.

MySQL не поддерживает оператор EXCEPT.

Синтаксис

Базовый синтаксис EXCEPT следующий:

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

EXCEPT

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

 

Здесь, в данном условии может быть любое выражение основанное на вашем требовании.

Пример

Рассмотрим следующие две таблицы.

Таблица 1 — Таблица CUSTOMERS выглядит следующим образом:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Maxim    |  35 | Moscow    | 21000.00 |
|  2 | AndreyEx |  38 | Krasnodar | 55500.00 |
|  3 | Oleg     |  33 | Rostov    | 34000.00 |
|  4 | Masha    |  35 | Moscow    | 34000.00 |
|  5 | Ruslan   |  34 | Omsk      | 45000.00 |
|  6 | Dima     |  32 | SP        | 45000.
00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+

 

Таблица 2 — таблица ORDERS состоит из следующих записей:

+-----+---------------------+-------------+--------+
|OID  | DATE                | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2017-01-08 00:00:00 |           3 |  34200 |
| 100 | 2017-01-08 00:00:00 |           3 |  25000 |
| 101 | 2017-02-10 00:00:00 |           2 |  23450 |
| 103 | 2017-03-12 00:00:00 |           4 |  34000 |
+-----+---------------------+-------------+--------+

 

Теперь, давайте объединим эти две таблицы в заявлении SELECT, как показано ниже.

SQL> SELECT  ID, NAME, AMOUNT, DATE
   FROM CUSTOMERS
   LEFT JOIN ORDERS
   ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
EXCEPT
   SELECT  ID, NAME, AMOUNT, DATE
   FROM CUSTOMERS
   RIGHT JOIN ORDERS
   ON CUSTOMERS. ID = ORDERS.CUSTOMER_ID;

 

Это произведет следующий результат.

+------+----------+--------+---------------------+
| ID   | NAME     | AMOUNT | DATE                |
+------+----------+--------+---------------------+
|    1 | Maxim    |   NULL | NULL                |
|    5 | Ruslan   |   NULL | NULL                |
|    6 | Dima     |   NULL | NULL                |
|    7 | Roma     |   NULL | NULL                |
+------+----------+--------+---------------------+

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Кроме замены в mysql? — Переполнение стека

Задавать вопрос

спросил

Изменено 5 лет, 7 месяцев назад

Просмотрено 2к раз

Мне нужно написать код в mysql, но в основном я пишу в MS SQL и вот проблема, в MS SQL я могу использовать ЗА ИСКЛЮЧЕНИЕМ и у меня все нормально. Но в MySQL все не так просто, я пробовал с NOT IN и NOT EXISTS, но это не дало мне такого же результата. Мой код MS SQL:

 ВЫБЕРИТЕ P.IDRoom, R.IDRoom, R.DateB, R.DataE
FROM Room P LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
ПРИСОЕДИНЯЙТЕСЬ к отелю H ON P.IDHotelу = H.IDHotelу
ГДЕ P.NumberOfBeds = 2 И H.IDHotelu = 2
КРОМЕ
ВЫБЕРИТЕ P.IDRoom, R.IDRoom, R.DateB, R.DataE
FROM Room P ПРИСОЕДИНЯЙТЕСЬ к бронированию R ON P.IDRoom = R.IDRoom
ГДЕ '2017-12-10' МЕЖДУ DataB И DataE;
 

Как вы видите, я ищу отель с 2 кроватями и идентификатором отеля 2. но я не хочу видеть номера, которые уже забронированы, поэтому я использую, кроме и ищу забронированные номера… но это легко в MS SQL, в MySQL у меня ничего не работает -_-. Есть идеи?

3

Обычно я создаю подзапрос и присоединяю к нему внешнюю таблицу с помощью LEFT JOIN. Затем это позволяет вам поместить столбец WHERE IS NULL.

 ВЫБЕРИТЕ
    P.IDRoom
   ,R.IDКомната
   ,R.DateB
   ,R. DataE
ОТ
    Комната П
    LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
    INNER JOIN Hotel H ON P.IDОтель = H.IDОтель
ЛЕВОЕ СОЕДИНЕНИЕ (
    ВЫБИРАТЬ
        P.IDRoom КАК IDRoom1
        ,R.IDRoom КАК IDRoom2
        ,R.DateB
        ,R.DataE
    ОТ
        Комната П
        ПРИСОЕДИНЯЙТЕСЬ к бронированию R ON P.IDRoom = R.IDRoom
    ГДЕ
        '2017-12-10' МЕЖДУ DataB И DataE
) AS e ON P.IDRoom = e.IDRoom1 И R.IDRoom = e.IDRoom2 И R.DateB = e.DateB И R.DataE = R.DataE
ГДЕ
    P.NumberOfBeds = 2 AND H.IDHotelu = 2
    И e.IDRoom1 имеет значение NULL
 
2

Приведенный ниже запрос должен вести себя как , ЗА ИСКЛЮЧЕНИЕМ

 SELECT P.IDRoom, R.IDRoom, R.DateB, R.DataE
ИЗ Комнаты Р
LEFT JOIN Reservation R ON P.IDRoom = R.IDRoom
ПРИСОЕДИНЯЙТЕСЬ к отелю H ON P.IDHotelу = H.IDHotelу
ГДЕ P.NumberOfBeds = 2 И H.IDHotelu = 2
    И НЕ СУЩЕСТВУЕТ(
        ВЫБЕРИТЕ 1
        ИЗ Комнаты i_P
        ПРИСОЕДИНЯЙТЕСЬ к бронированию i_R ON i_P. IDRoom = i_R.IDRoom
        ГДЕ '2017-12-10' МЕЖДУ DataB И DataE
            И i_P.IDRoom = P.IDRoom
    )
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Команды INTERSECT и EXCEPT в MySQL

MySQL теперь поддерживает операторы множества INTERSECT и EXCEPT . Операторы множества работают с результатами нескольких операторов SELECT. В этом посте мы увидим примеры запросов, использующих команды INTERSECT и EXCEPT для лучшего понимания 74 абсолютно бесплатно при подписке на информационный бюллетень OpenLampTech .

В то время как MySQL поддерживает команды UNION и UNION ALL , в языке не было команд INTERSECT или , КРОМЕ . Это часто включало обходные запросы. Однако теперь MySQL поддерживает операторы set INTERCEPT и EXCEPT .

Для примеров запросов я использую 2 простые таблицы с произвольными данными.

Таблица имен :

И таблица more_names :

MySQL INTERSECT

INTERSECT возвращает те строки, которые являются общими для всех задействованных ВЫБЕРИТЕ инструкций.

 SELECT * FROM more_names 
INTERSECT
SELECT * FROM имен;
MySQL EXCEPT

EXCEPT возвращает только те строки из первого оператора SELECT , которые не найдены во втором SELECT оператор:

 SELECT * FROM more_names 
EXCEPT
SELECT * FROM имен;

Таким образом, вполне возможно, что вам будут возвращены разные результаты в зависимости от того, какой SELECT запрос стоит первым в операторе EXCEPT :

 SELECT * FROM имен 
EXCEPT
SELECT * FROM more_names;

Посетите официальную документацию MySQL INTERSECT и EXCEPT для получения дополнительной информации.

Спасибо, что прочитали этот пост. Пожалуйста, поделитесь им с кем-то еще, кому это тоже понравится.


Джош Отвелл хочет развиваться как разработчик PHP, эксперт по SQL и технический блоггер/писатель.

Отказ от ответственности: большинство примеров в этом посте выполняются в среде рабочей станции для персональной разработки/обучения, и не следует считать производственным качеством или готовым . Ваши конкретные цели и потребности могут отличаться. Как всегда, только потому, что вы можете что-то сделать, не означает, что вы должны . Мои мнения являются моими собственными.

Чем еще я могу помочь

  • LoopGenius поможет вам найти клиентов, распространить информацию о вашей подработке и превратить вашу идею в веб-сайт. Используйте код купона: KZGZ3WSP , когда вы зарегистрируетесь сегодня и получите скидку 10%!
  • Узнайте о Google Analytics с помощью этого курса, подготовленного ребятами из The Content Technologist.
  • Нужен хостинг для вашего следующего веб-приложения или сайта WordPress? Я настоятельно рекомендую Hostinger и использовать их для размещения моего нишевого сайта по ловле окуня . Сервис не имеет себе равных.
  • 🔒 5 истин, которые я осознал как разработчик-самоучка
  • Мобильные обои, цифровые загрузки, фотографии, услуги по разработке и контент — все в одном Магазин Kofi Страница .