В чем разница между UNION
и UNION ALL
?
В чем разница между UNION и UNION ALL?
Ответы (22)
UNION
удаляет повторяющиеся записи (где все столбцы в результатах совпадают), UNION ALL
- нет.
Использование UNION
вместо UNION ALL
снижает производительность, поскольку сервер базы данных должен выполнять дополнительную работу по удалению повторяющихся строк, но обычно дубликаты не нужны (особенно при разработке отчетов).
UNION Пример:
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Результат:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
UNION ALL пример:
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Результат:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
order by
- person youcantryreachingme; 06.05.2021
И UNION, и UNION ALL объединяют результат двух разных SQL. Они различаются способом обработки дубликатов.
UNION выполняет DISTINCT для набора результатов, удаляя любые повторяющиеся строки.
UNION ALL не удаляет дубликаты, поэтому работает быстрее, чем UNION.
Примечание. При использовании этих команд все выбранные столбцы должны иметь один и тот же тип данных.
Пример: если у нас есть две таблицы: 1) Сотрудник и 2) Клиент.
- Данные таблицы сотрудников:
- Данные таблицы клиентов:
- Пример UNION (удаляет все повторяющиеся записи):
- Пример UNION ALL (он просто объединяет записи, а не удаляет дубликаты, поэтому он быстрее, чем UNION):
UNION
удаляет дубликаты, а UNION ALL
- нет.
Чтобы удалить дубликаты, набор результатов должен быть отсортирован, и это может повлиять на производительность UNION, в зависимости от объема сортируемых данных и настроек различных параметров СУБД (для Oracle PGA_AGGREGATE_TARGET
с WORKAREA_SIZE_POLICY=AUTO
или SORT_AREA_SIZE
и SOR_AREA_RETAINED_SIZE
, если WORKAREA_SIZE_POLICY=MANUAL
).
В принципе, сортировка выполняется быстрее, если ее можно выполнять в памяти, но действует то же предостережение относительно объема данных.
Конечно, если вам нужны данные, возвращаемые без дубликатов, вы должны использовать UNION, в зависимости от источника ваших данных.
Я бы прокомментировал первый пост, чтобы квалифицировать его как «гораздо менее эффективный» комментарий, но у меня недостаточно репутации (очков) для этого.
В ORACLE: UNION не поддерживает типы столбцов BLOB (или CLOB), UNION ALL поддерживает.
Основное различие между UNION и UNION ALL заключается в том, что операция объединения удаляет повторяющиеся строки из набора результатов, но объединение all возвращает все строки после объединения.
из http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
Вы можете избежать дублирования и по-прежнему работать намного быстрее, чем UNION DISTINCT (который фактически совпадает с UNION), выполнив такой запрос:
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
Обратите внимание на часть AND a!=X
. Это намного быстрее, чем UNION.
UNION
- UNION
также удаляет дубликаты, возвращаемые подзапросами, тогда как ваш подход не будет.
- person Frank Schmitt; 19.09.2017
СОЕДИНЕНИЕ
Команда UNION
используется для выбора связанной информации из двух таблиц, как и команда JOIN
. Однако при использовании команды UNION
все выбранные столбцы должны иметь один и тот же тип данных. С UNION
выбираются только отдельные значения.
UNION ALL
Команда UNION ALL
аналогична команде UNION
, за исключением того, что UNION ALL
выбирает все значения.
Разница между Union
и Union all
заключается в том, что Union all
не удаляет повторяющиеся строки, вместо этого он просто извлекает все строки из всех таблиц, соответствующих специфике вашего запроса, и объединяет их в таблицу.
Оператор UNION
эффективно выполняет SELECT DISTINCT
на наборе результатов. Если вы знаете, что все возвращенные записи уникальны для вашего объединения, используйте вместо этого UNION ALL
, это даст более быстрые результаты.
Просто чтобы добавить мои два цента к обсуждению здесь: оператор UNION
можно понять как чистый, ориентированный на SET UNION - например, установить A = {2,4,6,8}, установить B = {1,2,3,4}, A UNION B = {1,2,3,4,6,8}
При работе с наборами вам не нужно, чтобы числа 2 и 4 появлялись дважды, поскольку элемент либо находится, либо отсутствует в наборе.
Однако в мире SQL вы можете захотеть увидеть все элементы из двух наборов вместе в одной «сумке» {2,4,6,8,1,2,3,4}. А для этого T-SQL предлагает оператор UNION ALL
.
UNION ALL
не предлагается T-SQL. UNION ALL
является частью стандарта ANSI SQL и не относится к MS SQL Server.
- person Frank Schmitt; 22.06.2017
СОЕДИНЕНИЕ - приводит к отдельным записям
в то время как
СОЕДИНЕНИЕ ВСЕ - приводит ко всем записям, включая дубликаты.
Оба являются блокирующими операторами, и поэтому я лично предпочитаю использовать JOINS вместо блокирующих операторов (UNION, INTERSECT, UNION ALL и т. Д.) В любое время.
Чтобы проиллюстрировать, почему операция Union работает плохо по сравнению с проверкой Union All, в следующем примере.
CREATE TABLE #T1 (data VARCHAR(10))
INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'
CREATE TABLE #T2 (data VARCHAR(10))
INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'
Ниже приведены результаты операций UNION ALL и UNION.
Оператор UNION эффективно выполняет SELECT DISTINCT для набора результатов. Если вы знаете, что все возвращенные записи уникальны для вашего объединения, используйте вместо этого UNION ALL, это даст более быстрые результаты.
Использование UNION приводит к операциям четкой сортировки в плане выполнения. Доказательство этого утверждения показано ниже:
union
, используя комбинацию join
s и некоторых действительно неприятных case
s, но это делает запрос почти невозможным для чтения и поддержки, и, по моему опыту, это также ужасно для представление. Сравните: select foo.bar from foo union select fizz.buzz from fizz
против select case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
- person Devin Lamothe; 18.10.2016
Не уверен, что имеет значение, какая база данных
UNION
и UNION ALL
должны работать на всех серверах SQL.
Вы должны избегать ненужных UNION
s, поскольку это огромная утечка производительности. Как правило, используйте UNION ALL
, если вы не уверены, что использовать.
union используется для выбора различных значений из двух таблиц, где как union all используется для выбора всех значений, включая дубликаты, из таблиц
Это хорошо понимать с помощью диаграммы Венна.
вот ссылка < / a> к источнику. Есть хорошее описание.
()
, показанным во второй раз. На самом деле, если подумать, поскольку результат union all
не является набором, вам не следует пытаться нарисовать его с помощью диаграммы Венна!
- person onedaywhen; 02.12.2016
(Из книги Microsoft SQL Server Online)
СОЮЗ [ВСЕ]
Указывает, что несколько наборов результатов должны быть объединены и возвращены как один набор результатов.
ВСЕ
Включает все строки в результаты. Сюда входят дубликаты. Если не указано, повторяющиеся строки удаляются.
UNION
займет слишком много времени, так как к результатам применяется поиск повторяющихся строк, например DISTINCT
.
SELECT * FROM Table1
UNION
SELECT * FROM Table2
эквивалентно:
SELECT DISTINCT * FROM (
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2) DT
Побочным эффектом применения
DISTINCT
к результатам является операция сортировки результатов.
UNION ALL
результаты будут отображаться в произвольном порядке результатов. Но UNION
результаты будут отображаться как ORDER BY 1, 2, 3, ..., n (n = column number of Tables)
, примененные к результатам. Вы можете увидеть этот побочный эффект, когда у вас нет повторяющейся строки.
Я добавляю пример,
ОБЪЕДИНЕНИЕ, он объединяется с отдельными -> медленнее, поскольку требует сравнения (в разработчике Oracle SQL выберите запрос, нажмите F10, чтобы просмотреть анализ затрат).
ОБЪЕДИНЕНИЕ ВСЕ, это слияние без отчетливого -> быстрее.
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
а также
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
UNION
объединяет содержимое двух структурно-совместимых таблиц в единую объединенную таблицу.
- Разница:
Разница между UNION
и UNION ALL
заключается в том, что UNION will
пропускает повторяющиеся записи, тогда как UNION ALL
будет включать повторяющиеся записи.
Union
Набор результатов сортируется в порядке возрастания, тогда как UNION ALL
Набор результатов не сортируется
UNION
выполняет DISTINCT
для своего набора результатов, чтобы исключить любые повторяющиеся строки. В то время как UNION ALL
не удаляет дубликаты и, следовательно, быстрее, чем _11 _. *
Примечание: производительность UNION ALL
обычно выше, чем UNION
, поскольку UNION
требует, чтобы сервер проделал дополнительную работу по удалению любых дубликатов. Поэтому в случаях, когда точно известно, что дубликатов не будет, или если дубликаты не являются проблемой, рекомендуется использовать UNION ALL
по соображениям производительности.
ORDER BY
, отсортированные результаты не гарантируются. Возможно, вы имеете в виду конкретного поставщика SQL (даже тогда, в порядке возрастания, что именно ...?), Но в этом вопросе нет тегов vendor = specific.
- person onedaywhen; 05.12.2016
Предположим, у вас есть два стола Учитель и Ученик.
У обоих есть 4 столбца с разными именами, как это
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
Вы можете применить UNION или UNION ALL для тех двух таблиц, которые имеют одинаковое количество столбцов. Но у них другое имя или другой тип данных.
Когда вы применяете операцию UNION
к 2 таблицам, она игнорирует все повторяющиеся записи (значение всех столбцов строки в таблице такое же, как и в другой таблице). Нравится
SELECT * FROM Student
UNION
SELECT * FROM Teacher
результат будет
Когда вы применяете операцию UNION ALL
к 2 таблицам, она возвращает все записи с дубликатами (если есть какое-либо различие между любым значением столбца строки в 2 таблицах). Нравится
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
Производительность:
Очевидно, что UNION ALL по производительности лучше, чем UNION, поскольку они выполняют дополнительную задачу по удалению повторяющихся значений. Вы можете проверить это в Расчетное время выполнения, нажав ctrl + L в MSSQL.
UNION
для передачи намерения (т.е. без дубликатов), потому что UNION ALL
вряд ли даст какой-либо реальный прирост производительности в абсолютном выражении.
- person onedaywhen; 05.12.2016
Еще кое-что хотелось бы добавить -
Объединение: набор результатов отсортирован в порядке возрастания.
Объединить все: - набор результатов не отсортирован. Два вывода запроса просто добавляются.
UNION
НЕ сортирует результат в порядке возрастания. Любое упорядочивание, которое вы видите в результате без использования order by
, является чистым совпадением. СУБД может использовать любую стратегию, которая, по ее мнению, эффективна для удаления дубликатов. Этот может быть сортировкой, но это также может быть алгоритм хеширования или что-то совершенно иное - и стратегия будет меняться с количеством строк. union
, который отображается отсортирован по 100 строкам, может не иметь 100 000 строк.
- person a_horse_with_no_name; 27.04.2016
ORDER BY
.
- person spencer7593; 13.10.2016
UNION удаляет повторяющиеся записи, с другой стороны UNION ALL этого не делает. Но нужно проверить объем данных, который будет обрабатываться, а столбец и тип данных должны быть одинаковыми.
поскольку объединение внутренне использует "отличное" поведение для выбора строк, следовательно, это более затратно с точки зрения времени и производительности. нравиться
select project_id from t_project
union
select project_id from t_project_contact
это дает мне 2020 рекордов
с другой стороны
select project_id from t_project
union all
select project_id from t_project_contact
дает мне более 17402 строк
с точки зрения приоритета оба имеют одинаковый приоритет.
Если ORDER BY
нет, UNION ALL
может возвращать строки по мере их поступления, тогда как UNION
заставит вас ждать до самого конца запроса, прежде чем сразу дать вам весь набор результатов. Это может иметь значение в ситуации тайм-аута - UNION ALL
как бы поддерживает соединение.
Поэтому, если у вас есть проблема с тайм-аутом, нет сортировки и дубликаты не являются проблемой, UNION ALL
может оказаться весьма полезным.
UNION и UNION ALL используются для объединения двух или более результатов запроса.
Команда UNION выбирает различную и связанную информацию из двух таблиц, что устраняет повторяющиеся строки.
С другой стороны, команда UNION ALL выбирает все значения из обеих таблиц, в которых отображаются все строки.
Важный! Разница между Oracle и Mysql: предположим, что t1 t2 не имеет повторяющихся строк между ними, но у них есть отдельные повторяющиеся строки. Пример: t1 имеет продажи с 2017 г. и t2 с 2018 г.
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
В ORACLE UNION ALL выбираются все строки из обеих таблиц. То же самое произойдет и в MySQL.
Однако:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
В ORACLE UNION выбирает все строки из обеих таблиц, поскольку между t1 и t2 нет повторяющихся значений. С другой стороны, в MySQL набор результатов будет иметь меньше строк, потому что будут дублироваться строки в таблице t1, а также в таблице t2!
x union y
- это select distinct * from (x union all y)
. select 1 from dual union select 1 from dual
& (select 1 from dual union all select 1 from dual) union select 1 from dual
оба возвращают 1 строку. PS Я не знаю, подразумеваете ли вы под t1 и t2 T1 и T1, но важно то, что указано в select. PS Для примера UNION (отдельного) вы не можете четко сказать, с точки зрения дубликатов, что вводится и для каждой СУБД, что она возвращает или почему. Используйте достаточно слов, предложений и ссылок на части примеров, чтобы было понятно.
- person philipxy; 24.02.2021
UNION ALL
также работает с другими типами данных. Например, при попытке объединения пространственных типов данных. Например:
select a.SHAPE from tableA a
union
select b.SHAPE from tableB b
бросит
The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
Однако union all
не будет.