Spec-Zone.ru › MariaDB

INTERSECT

MariaDB начиная с 10.3.0

INTERSECT был представлен в MariaDB 10.3.0.

Результат операции intersect — это пересечение результатов правого и левого SELECT наборов, т.е. в результат войдут только записи, присутствующие в обоих наборах результатов.

Синтаксис

SELECT ...
(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...
[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...]
[ORDER BY [column [, column ...]]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]

Описание

MariaDB поддерживает INTERSECT (а также EXCEPT) помимо UNION начиная с MariaDB 10.3.

Все правила именования столбцов, ORDER BY и LIMIT такие же, как и для UNION.

INTERSECT неявно предполагает операцию DISTINCT.

Результат операции intersect — это пересечение результатов правого и левого SELECT наборов, т.е. в результат войдут только записи, присутствующие в обоих наборах результатов.

INTERSECT имеет более высокий приоритет, чем UNION и EXCEPT (кроме случаев работы в режиме Oracle mode, где все три имеют одинаковый приоритет). Если возможно, выполнение будет линейным, но в противном случае оно будет преобразовано в подзапрос в FROM:

(select a,b from t1)
union
(select c,d from t2)
intersect
(select e,f from t3)
union
(select 4,4);

будет преобразовано в:

(select a,b from t1)
union
select c,d from
  ((select c,d from t2)
   intersect
   (select e,f from t3)) dummy_subselect
union
(select 4,4)



MariaDB начиная с 10.4.0

Скобки

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

MariaDB начиная с 10.5.0

ALL/DISTINCT

INTERSECT ALL и INTERSECT DISTINCT были введены в MariaDB 10.5.0. Оператор ALL оставляет дубликаты, в то время как оператор DISTINCT удаляет дубликаты. По умолчанию используется DISTINCT, если ни один из операторов не указан, и это единственный способ работы до MariaDB 10.5.

Примеры

Показать клиентов, которые являются сотрудниками:

(SELECT e_name AS name, email FROM employees)
INTERSECT
(SELECT c_name AS name, email FROM customers);

Разница между 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)) INTERSECT (SELECT c FROM t3);
+------+
| a    |
+------+
|    1 |
|    6 |
+------+

(SELECT a FROM t1) UNION ((SELECT b FROM t2) INTERSECT (SELECT c FROM t3));
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    6 |
+------+

См. также

  • UNION
  • EXCEPT
  • 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/intersect/

Spec-Zone.ru

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