Spec-Zone .ru
спецификации, руководства, описания, API

13.2.9.4. UNION Синтаксис

SELECT ...UNION [ALL | DISTINCT] SELECT ...[UNION [ALL | DISTINCT] SELECT ...]

UNION используется, чтобы объединить следствие многократного SELECT операторы в единственный набор результатов.

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

Если типы данных соответствующих SELECT столбцы не соответствуют, типы и длины столбцов в UNION результат принимает во внимание значения, полученные всем из SELECT операторы. Например, рассмотрите следующее:

mysql> SELECT REPEAT('a',1) UNION SELECT
        REPEAT('b',10);+---------------+| REPEAT('a',1) |+---------------+| a             || bbbbbbbbbb    |+---------------+

SELECT операторы являются нормальными избранными операторами, но со следующими ограничениями:

Поведение значения по умолчанию для UNION это, дублирующиеся строки удаляются из результата. Дополнительное DISTINCT ключевое слово не имеет никакого эффекта кроме значения по умолчанию, потому что это также определяет удаление дублирующейся строки. С дополнительным ALL ключевое слово, удаление дублирующейся строки не происходит, и результат включает все строки соответствия от весь SELECT операторы.

Можно смешаться UNION ALL и UNION DISTINCT в том же самом запросе. Смешанный UNION типы обрабатываются так, что a DISTINCT объединение переопределяет любого ALL объединение с его левой стороны от него. A DISTINCT объединение может быть произведено явно при использовании UNION DISTINCT или неявно при использовании UNION без следующего DISTINCT или ALL ключевое слово.

Применяться ORDER BY или LIMIT человеку SELECT, поместите пункт в круглых скобках, которые включают SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)UNION(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

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

Использовать ORDER BY или LIMIT пункт, чтобы сортировать или ограничить все UNION закончитесь, заключите человека в скобки SELECT операторы и место ORDER BY или LIMIT после последнего. Следующий пример использует оба пункта:

(SELECT a FROM t1 WHERE a=10 AND B=1)UNION(SELECT a FROM t2 WHERE a=11 AND B=2)ORDER BY a LIMIT 10;

Оператор без круглых скобок эквивалентен одному заключенному в скобки как только показано.

Это отчасти ORDER BY не может использовать ссылки столбца, которые включают имя таблицы (то есть, имена в tbl_name.col_name формат). Вместо этого обеспечьте псевдоним столбца в первом SELECT оператор и обращается к псевдониму в ORDER BY. (Альтернативно, обратитесь к столбцу в ORDER BY использование его позиции столбца. Однако, использование позиций столбца осуждается.)

Кроме того, если столбец, который будет сортирован, искажается, ORDER BY пункт должен отнестись к псевдониму, не имени столбца. Первый из следующих операторов будет работать, но второе перестанет работать с Unknown column 'a' in 'order clause' ошибка:

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;

Вызвать строки в a UNION результат состоять из наборов строк, полученных каждым SELECT один за другим выберите дополнительный столбец в каждом SELECT использовать в качестве столбца вида и добавить ORDER BY после последнего SELECT:

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)UNION(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col;

Дополнительно поддержать порядок сортировки в пределах человека SELECT результаты, добавляет вторичный столбец к ORDER BY пункт:

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)UNION(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;

Использование дополнительного столбца также позволяет Вам определить который SELECT каждая строка прибывает из. Дополнительные столбцы могут предоставить другую информацию об идентификации также, такую как строка, которая указывает на имя таблицы.