INTERSECT
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, для указания приоритета можно использовать скобки. Раньше возвращалась ошибка синтаксиса.
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 (учебное видео)
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/intersect/