MySQL
UNION
Поиск…
Синтаксис
- UNION DISTINCT - отчисления после объединения SELECT
- UNION ALL - без дедуплирования (быстрее)
- UNION - по умолчанию DISTINCT
- SELECT ... UNION SELECT ... - это нормально, но неоднозначно на
ORDER BY
- (SELECT ...) UNION (SELECT ...) ORDER BY ... - устраняет двусмысленность
замечания
UNION не использует несколько процессоров.
UNION всегда * включает временную таблицу для сбора результатов. * Начиная с 5.7.3 / MariaDB 10.1, некоторые формы UNION предоставляют результаты без использования таблицы tmp (следовательно, быстрее).
Объединение операторов SELECT с UNION
Вы можете комбинировать результаты двух идентично структурированных запросов с ключевым словом UNION
.
Например, если вам нужен список всех контактных данных из двух отдельных таблиц, authors
и editors
, например, вы можете использовать ключевое слово UNION
так:
select name, email, phone_number
from authors
union
select name, email, phone_number
from editors
Использование union
само по себе будет вытеснять дубликаты. Если вам нужно сохранить дубликаты в своем запросе, вы можете использовать ключевое слово ALL
так: UNION ALL
.
СОРТИРОВАТЬ ПО
Если вам нужно отсортировать результаты UNION, используйте этот шаблон:
( SELECT ... )
UNION
( SELECT ... )
ORDER BY
Без круглых скобок конечный ORDER BY будет принадлежать последнему SELECT.
Разбиение страницы с помощью OFFSET
При добавлении LIMIT в UNION это шаблон для использования:
( SELECT ... ORDER BY x LIMIT 10 )
UNION
( SELECT ... ORDER BY x LIMIT 10 )
ORDER BY x LIMIT 10
Поскольку вы не можете предсказать, какие из SELECT (s) будут иметь значение «10», вам нужно получить 10 из каждого, а затем еще больше уничтожить список, повторяя оба ORDER BY
и LIMIT
.
Для 4-й страницы из 10 элементов этот шаблон необходим:
( SELECT ... ORDER BY x LIMIT 40 )
UNION
( SELECT ... ORDER BY x LIMIT 40 )
ORDER BY x LIMIT 30, 10
То есть, собрать 4 страницы в каждом SELECT
, а затем сделать OFFSET
в UNION
.
Объединение данных с разными столбцами
SELECT name, caption as title, year, pages FROM books
UNION
SELECT name, title, year, 0 as pages FROM movies
При объединении двух наборов записей с разными столбцами, эмулируйте отсутствующие значения по умолчанию.
UNION ALL и UNION
SELECT 1,22,44 UNION SELECT 2,33,55
SELECT 1,22,44 UNION SELECT 2,33,55 UNION SELECT 2,33,55
Результат такой же, как и выше.
использовать UNION ALL
когда
SELECT 1,22,44 UNION SELECT 2,33,55 UNION ALL SELECT 2,33,55
Объединение и объединение данных в разные таблицы MySQL с одинаковыми столбцами в уникальные строки и выполнение запроса
Этот UNION ALL объединяет данные из нескольких таблиц и служит псевдонимом имени таблицы для использования в ваших запросах:
SELECT YEAR(date_time_column), MONTH(date_time_column), MIN(DATE(date_time_column)), MAX(DATE(date_time_column)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM (
(SELECT date_time_column, ip FROM server_log_1 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log_2 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log_3 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log WHERE state = 'action' AND log_id = 150)
) AS table_all
GROUP BY YEAR(date_time_column), MONTH(date_time_column);