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_ID | ProdName | Maker | Quantity |
1 | хлеб | AB | 100 |
2 | молоко | CD | 65 |
3 | мясо | EF | 75 |
4 | рыба | GH | 60 |
5 | сахар | IJ | 45 |
Таблица VETEROK:
Prod_ID | ProdName | Maker | Quantity |
1 | хлеб | QW | 85 |
2 | молоко | LD | 70 |
3 | сыр | MV | 45 |
4 | масло | DG | 62 |
5 | рыба | LN | 55 |
Пересечением множеств A и B называется множество, состоящее их всех тех или только тех
элементов, которые принадлежат каждому из множеств
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке
Скрипт для создания базы данных магазинов, её таблиц и заполения таблиц данными — в файле по этой ссылке.
Пример 1. Вывести список продуктов, которые имеются и в мазазине Solnyshko, и в магазине Veterok. Пишем следующий запрос с использованием оператора SQL INTERSECT:
SELECT ProdName FROM Solnyshko INTERSECT SELECT ProdName FROM Veterok
Результатом выполнения запроса будет следующая таблица:
ProdName |
хлеб |
молоко |
рыба |
Пример 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 отсутствует. Наиболее простой альтернативный способ реализации разности множеств связан с использованием
Пример 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.
Синтаксис
Базовый синтаксис 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 имеет значение NULL2
Приведенный ниже запрос должен вести себя как , ЗА ИСКЛЮЧЕНИЕМ
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 Страница .