Spec-Zone.ru › MariaDB

ОБЪЕДИНЕНИЕ

UNION используется для объединения результатов из нескольких операторов SELECT в один результирующий набор.

Синтаксис

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

Описание

UNION используется для объединения результатов из нескольких операторов SELECT в один результирующий набор.

Имена столбцов из первого SELECT оператора используются как имена столбцов для возвращаемых результатов. Выбранные столбцы, указанные в соответствующих позициях каждого оператора SELECT, должны иметь одинаковый тип данных. (Например, первый столбец, выбранный первым оператором, должен иметь тот же тип, что и первый столбец, выбранный другими операторами.)

Если этого нет, тип и длина столбцов в результате учитывают значения, возвращаемые всеми операторами SELECT, поэтому нет необходимости в явном приведении типов. Обратите внимание, что в настоящее время это не так для рекурсивных CTE - см. MDEV-12325.

Имена таблиц могут быть указаны как db_name.tbl_name. Это позволяет писать UNION которые охватывают несколько баз данных. Подробности синтаксиса см. в разделе Квалификаторы идентификаторов.

Операторы UNION нельзя использовать с функциями агрегирования.

EXCEPT и UNION имеют тот же приоритет операции, а INTERSECT имеет более высокий приоритет, если не работает в режиме Oracle, в этом случае все три имеют одинаковый приоритет.

ALL/DISTINCT

Ключевое слово ALL сохраняет дубликаты строк. Ключевое слово DISTINCT (по умолчанию, если ключевое слово опущено) удаляет дубликаты строк в результатах.

UNION ALL и UNION DISTINCT могут оба присутствовать в запросе. В этом случае UNION DISTINCT переопределяет любые UNION ALL слева от него.

MariaDB, начиная с 10.1.1

До MariaDB 10.1.1 все операторы UNION ALL требовали от сервера создания временной таблицы. С MariaDB 10.1.1 сервер в большинстве случаев может выполнять UNION ALL без создания временной таблицы, повышая производительность (см. MDEV-334).

ORDER BY и LIMIT

Отдельные операторы SELECT могут содержать свои собственные предложения ORDER BY и LIMIT. В этом случае отдельные запросы должны быть заключены в скобки. Однако это не влияет на порядок UNION, поэтому они полезны только для ограничения чтения записей одним SELECT.

Операция UNION может иметь глобальные предложения ORDER BY и LIMIT, которые влияют на весь результат. Если столбцы, извлеченные из отдельных операторов SELECT, имеют псевдоним (AS), ORDER BY должен использовать этот псевдоним, а не реальные имена столбцов.

HIGH_PRIORITY

Указание запроса как HIGH_PRIORITY не будет работать внутри UNION. Если применить к первому SELECT, он будет проигнорирован. Применение к последующему SELECT приводит к синтаксической ошибке:

ERROR 1234 (42000): Incorrect usage/placement of 'HIGH_PRIORITY'

SELECT ... INTO ...

Отдельные операторы SELECT нельзя записать INTO DUMPFILE или INTO OUTFILE. Если последний оператор SELECT указывает INTO DUMPFILE или INTO OUTFILE, весь результат UNION будет записан. Размещение предложения после любого другого SELECT приведет к синтаксической ошибке.

Если результат — одна строка, также можно использовать SELECT ... INTO @var_name.

MariaDB, начиная с 10.4.0

Скобки

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

Примеры

UNION между таблицами с разными именами столбцов:

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

Указание глобального порядка UNION и ограничения общего количества строк:

(SELECT name, email FROM employees)
UNION
(SELECT name, email FROM customers)
ORDER BY name LIMIT 10;

Добавление постоянной строки:

(SELECT 'John Doe' AS name, 'john.doe@example.net' AS email)
UNION
(SELECT name, email FROM customers);

Различия типов:

SELECT CAST('x' AS CHAR(1)) UNION SELECT REPEAT('y',4);
+----------------------+
| CAST('x' AS CHAR(1)) |
+----------------------+
| x                    |
| yyyy                 |
+----------------------+

Возврат результатов в порядке каждого отдельного SELECT с помощью столбца сортировки:

(SELECT 1 AS sort_column, e_name AS name, email FROM employees)
UNION
(SELECT 2, c_name AS name, email FROM customers) ORDER BY sort_column;

Разница между 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 |
+------+

См. также

  • SELECT
  • EXCEPT
  • INTERSECT
  • Обзор рекурсивных общих табличных выражений
  • Подготовьтесь к теории множеств: UNION, INTERSECT и EXCEPT в 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/union/

Spec-Zone.ru

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