Spec-Zone .ru
спецификации, руководства, описания, API
|
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
операторы являются нормальными избранными операторами, но со следующими
ограничениями:
Только последнее SELECT
оператор может использовать INTO
OUTFILE
. (Однако, все UNION
результат пишется файлу.)
HIGH_PRIORITY
не может использоваться с SELECT
операторы, которые являются частью a UNION
. Если Вы определяете это для первого SELECT
, это не имеет никакого эффекта. Если Вы определяете это для
кого-либо последующего 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
каждая строка прибывает из. Дополнительные столбцы могут предоставить
другую информацию об идентификации также, такую как строка, которая указывает на имя таблицы.