Класс/оператор 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 | +------+----------+--------+---------------------+