Spec-Zone.ru › MariaDB

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

Скобки

Начиная с MariaDB 10.4.0, скобки могут использоваться для указания приоритета. Раньше возвращалась ошибка синтаксиса.

MariaDB начиная с 10.5.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 |
+-----+

См. также

  • UNION
  • INTERSECT
  • Get Set for Set Theory: UNION, INTERSECT and EXCEPT in SQL (видео-урок)
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительную проверку MariaDB. Мнения, информация и мнения, выраженные в этом содержимом, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/except/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API