EXCEPT
Результат EXCEPT — все записи из левого SELECT результата, за исключением записей, присутствующих в правом SELECT результате, то есть это вычитание двух наборов результатов. Начиная с MariaDB 10.6.1, MINUS является синонимом, когда установлено SQL_MODE=ORACLE.
Синтаксис
SELECT ...
(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT])
SELECT ...
[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT])
SELECT ...]
[ORDER BY [{col_name | expr | position} [ASC | DESC]
[, {col_name | expr | position} [ASC | DESC] ...]]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}
| OFFSET start { ROW | ROWS }
| FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]
Обратите внимание:
- Скобки для явного указания приоритета операций не поддерживаются; используйте подзапрос в
FROM-клаузе как обходной путь.
Описание
MariaDB поддерживает EXCEPT и INTERSECT помимо UNION начиная с MariaDB 10.3.
Запросы перед и после EXCEPT должны быть операторами SELECT или VALUES.
Все поведение для именования столбцов, ORDER BY и LIMIT такое же, как для UNION. Обратите внимание, что альтернативный синтаксис SELECT ... OFFSET ... FETCH поддерживается. Это позволяет нам использовать WITH TIES-клаузу.
EXCEPT подразумевает операцию DISTINCT.
Результат EXCEPT — все записи из левого SELECT результата, за исключением записей, присутствующих в правом SELECT результате, то есть это вычитание двух наборов результатов.
EXCEPT и UNION имеют одинаковый приоритет операций, а INTERSECT имеет более высокий приоритет, если не используется режим Oracle, в противном случае все три имеют одинаковый приоритет.
Скобки
Начиная с MariaDB 10.4.0, скобки могут использоваться для указания приоритета. Раньше возвращалась ошибка синтаксиса.
ALL/DISTINCT
EXCEPT ALL и EXCEPT DISTINCT были введены в MariaDB 10.5.0. Оператор ALL оставляет дубликаты без изменений, в то время как оператор DISTINCT удаляет дубликаты. DISTINCT — это поведение по умолчанию, если ни один из операторов не указан, и единственное поведение до MariaDB 10.5.
Примеры
Показать клиентов, которые не являются сотрудниками:
(SELECT e_name AS name, email FROM customers) EXCEPT (SELECT c_name AS name, email FROM employees);
Разница между UNION, EXCEPT и INTERSECT. INTERSECT ALL и EXCEPT ALL доступны начиная с MariaDB 10.5.0.
CREATE TABLE seqs (i INT); INSERT INTO seqs VALUES (1),(2),(2),(3),(3),(4),(5),(6); SELECT i FROM seqs WHERE i <= 3 UNION SELECT i FROM seqs WHERE i>=3; +------+ | i | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | +------+ SELECT i FROM seqs WHERE i <= 3 UNION ALL SELECT i FROM seqs WHERE i>=3; +------+ | i | +------+ | 1 | | 2 | | 2 | | 3 | | 3 | | 3 | | 3 | | 4 | | 5 | | 6 | +------+ SELECT i FROM seqs WHERE i <= 3 EXCEPT SELECT i FROM seqs WHERE i>=3; +------+ | i | +------+ | 1 | | 2 | +------+ SELECT i FROM seqs WHERE i <= 3 EXCEPT ALL SELECT i FROM seqs WHERE i>=3; +------+ | i | +------+ | 1 | | 2 | | 2 | +------+ SELECT i FROM seqs WHERE i <= 3 INTERSECT SELECT i FROM seqs WHERE i>=3; +------+ | i | +------+ | 3 | +------+ SELECT i FROM seqs WHERE i <= 3 INTERSECT ALL SELECT i FROM seqs WHERE i>=3; +------+ | i | +------+ | 3 | | 3 | +------+
Скобки для указания приоритета, начиная с MariaDB 10.4.0
CREATE OR REPLACE TABLE t1 (a INT); CREATE OR REPLACE TABLE t2 (b INT); CREATE OR REPLACE TABLE t3 (c INT); INSERT INTO t1 VALUES (1),(2),(3),(4); INSERT INTO t2 VALUES (5),(6); INSERT INTO t3 VALUES (1),(6); ((SELECT a FROM t1) UNION (SELECT b FROM t2)) EXCEPT (SELECT c FROM t3); +------+ | a | +------+ | 2 | | 3 | | 4 | | 5 | +------+ (SELECT a FROM t1) UNION ((SELECT b FROM t2) EXCEPT (SELECT c FROM t3)); +------+ | a | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | +------+
Вот пример, который использует хранилище SEQUENCE и оператор VALUES для генерации числовой последовательности и удаления некоторых произвольных чисел из неё:
(SELECT seq FROM seq_1_to_10) EXCEPT VALUES (2), (3), (4); +-----+ | seq | +-----+ | 1 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | +-----+
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/except/