В чем разница между UNION и UNION ALL?

В чем разница между UNION и UNION ALL?


person Brian G    schedule 08.09.2008    source источник
comment
w3schools.com/sql/sql_union.asp   -  person Shiwangini    schedule 07.05.2019
comment
union all включает все идентификаторы в левой и правой таблице. где union включает уникальные идентификаторы в левой и правой таблице. union all позволяет дублировать идентификаторы. union работает как set в python, создавая отдельные идентификаторы   -  person Golden Lion    schedule 27.04.2021


Ответы (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)
person Community    schedule 08.09.2008
comment
Следствием этого является то, что объединение гораздо менее производительно, поскольку оно должно сканировать результат на наличие дубликатов. - person Matthew Watson; 09.09.2008
comment
Просто заметил, что здесь много хороших комментариев / ответов, поэтому я включил флаг вики и добавил примечание о производительности ... - person Jim Harte; 13.07.2011
comment
UNION ALL может быть медленнее, чем UNION в реальных случаях, когда сеть, такая как Интернет, является узким местом. Стоимость передачи большого количества повторяющихся строк может превышать выигрыш во времени выполнения запроса. Это необходимо анализировать в каждом конкретном случае. - person Charles Burns; 05.04.2012
comment
Также кажется, что это влияет на порядок сортировки по умолчанию. Например. 'select 9 union select 8 union select 7' возвращает результаты в обратном порядке, чтобы 'выбрать 9 объединить все выбрать 8 объединить все выбрать 7'. - person Nine Tails; 08.09.2015
comment
@CharlesBurns, это привело бы нас к необходимости знать пороговое значение количества повторяющихся записей по сравнению с общим количеством возвращенных записей, что делает штраф за их удаление перевешивает потери производительности при их передаче по сети или наоборот. На мой взгляд, с точки зрения движка базы данных, здесь нет сомнений в том, что UNION ALL предпочтительнее. Затем при необходимости следует оптимизировать сетевой трафик. - person Jaime; 09.11.2015
comment
Еще одно отличие, кажется, заключается в порядке результатов. UNION изменяет порядок результатов, а UNION ALL - нет. - person Mariusz; 09.02.2017
comment
@AdamCaviness Ваш комментарий не совсем понятен. - person kojow7; 17.09.2017
comment
UNION vs UNION ВСЕ различия в производительности зависят от ограничений, оптимизации и т. Д. Общий совет - использовать UNION только тогда, когда вы явно хотите удалить дубликаты. - person jarlh; 24.11.2017
comment
@Mariusz В таблице нет порядка, включая результат объединения или объединения всех. Наборы результатов упорядочиваются в крайнем порядке по. - person philipxy; 10.02.2021
comment
@AdamCaviness - возможно, вы имели в виду ... Моя общая практика - использовать UNION ALL, если я специально не хочу удалить дубликаты. - person Bob Jarvis - Reinstate Monica; 18.04.2021
comment
@ BobJarvis-ReinstateMonica Вы правы. Я должен был это уловить, прежде чем размещать комментарий, поэтому я просто удалил его. [съеживаться] :) - person Adam Caviness; 19.04.2021
comment
Порядок сортировки @NineTails никогда не гарантируется из RDMS, если вы не укажете предложение order by - person youcantryreachingme; 06.05.2021

И UNION, и UNION ALL объединяют результат двух разных SQL. Они различаются способом обработки дубликатов.

  • UNION выполняет DISTINCT для набора результатов, удаляя любые повторяющиеся строки.

  • UNION ALL не удаляет дубликаты, поэтому работает быстрее, чем UNION.

Примечание. При использовании этих команд все выбранные столбцы должны иметь один и тот же тип данных.

Пример: если у нас есть две таблицы: 1) Сотрудник и 2) Клиент.

  1. Данные таблицы сотрудников:

введите описание изображения здесь

  1. Данные таблицы клиентов:

введите описание изображения здесь

  1. Пример UNION (удаляет все повторяющиеся записи):

введите описание изображения здесь

  1. Пример UNION ALL (он просто объединяет записи, а не удаляет дубликаты, поэтому он быстрее, чем UNION):

введите описание изображения здесь

person Bhaumik Patel    schedule 14.10.2012
comment
все выбранные столбцы должны иметь один и тот же тип данных - на самом деле все не так строго (что нехорошо с точки зрения реляционной модели!). В стандарте SQL говорится, что их соответствующий дескриптор столбца должен быть таким же, за исключением названия. - person onedaywhen; 05.12.2016

UNION удаляет дубликаты, а UNION ALL - нет.

Чтобы удалить дубликаты, набор результатов должен быть отсортирован, и это может повлиять на производительность UNION, в зависимости от объема сортируемых данных и настроек различных параметров СУБД (для Oracle PGA_AGGREGATE_TARGET с WORKAREA_SIZE_POLICY=AUTO или SORT_AREA_SIZE и SOR_AREA_RETAINED_SIZE, если WORKAREA_SIZE_POLICY=MANUAL).

В принципе, сортировка выполняется быстрее, если ее можно выполнять в памяти, но действует то же предостережение относительно объема данных.

Конечно, если вам нужны данные, возвращаемые без дубликатов, вы должны использовать UNION, в зависимости от источника ваших данных.

Я бы прокомментировал первый пост, чтобы квалифицировать его как «гораздо менее эффективный» комментарий, но у меня недостаточно репутации (очков) для этого.

person mathewbutler    schedule 18.09.2008
comment
Чтобы удалить дубликаты, набор результатов должен быть отсортирован - возможно, вы имеете в виду конкретного поставщика, но в вопросе нет тегов, зависящих от поставщика. Даже если бы был, можете ли вы доказать, что дубликаты нельзя удалить без сортировки? - person onedaywhen; 05.12.2016
comment
Отдельный будет неявно сортировать результаты, потому что удаление дубликатов выполняется быстрее в отсортированном наборе. это не означает, что возвращаемый набор результатов фактически отсортирован таким образом, но в большинстве случаев отдельный (и, следовательно, UNION) будет внутренне сортировать набор результатов. - person DevilSuichiro; 25.10.2017

В ORACLE: UNION не поддерживает типы столбцов BLOB (или CLOB), UNION ALL поддерживает.

person Michiel Overeem    schedule 08.09.2008
comment
То же самое относится к MS SQL с несопоставимыми типами столбцов, как XML. - person Kuleris; 31.03.2021

Основное различие между UNION и UNION ALL заключается в том, что операция объединения удаляет повторяющиеся строки из набора результатов, но объединение all возвращает все строки после объединения.

из http://zengin.wordpress.com/2007/07/31/union-vs-union-all/

person George Mauer    schedule 08.09.2008

Вы можете избежать дублирования и по-прежнему работать намного быстрее, чем UNION DISTINCT (который фактически совпадает с UNION), выполнив такой запрос:

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

Обратите внимание на часть AND a!=X. Это намного быстрее, чем UNION.

person Ihor Vorotnov    schedule 13.08.2012
comment
Это приведет к пропуску строк и, следовательно, не приведет к ожидаемому результату, если a содержит значения NULL. Кроме того, он по-прежнему не возвращает тот же результат, что и UNION - UNION также удаляет дубликаты, возвращаемые подзапросами, тогда как ваш подход не будет. - person Frank Schmitt; 19.09.2017
comment
@FrankSchmitt - спасибо за ответ; этот бит о подзапросах - это именно то, что я хотел знать! - person Doradus; 16.03.2018

СОЕДИНЕНИЕ
Команда UNION используется для выбора связанной информации из двух таблиц, как и команда JOIN. Однако при использовании команды UNION все выбранные столбцы должны иметь один и тот же тип данных. С UNION выбираются только отдельные значения.

UNION ALL
Команда UNION ALL аналогична команде UNION, за исключением того, что UNION ALL выбирает все значения.

Разница между Union и Union all заключается в том, что Union all не удаляет повторяющиеся строки, вместо этого он просто извлекает все строки из всех таблиц, соответствующих специфике вашего запроса, и объединяет их в таблицу.

Оператор UNION эффективно выполняет SELECT DISTINCT на наборе результатов. Если вы знаете, что все возвращенные записи уникальны для вашего объединения, используйте вместо этого UNION ALL, это даст более быстрые результаты.

person DotNetGuy    schedule 16.08.2012

Просто чтобы добавить мои два цента к обсуждению здесь: оператор 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.

person Peter Perháč    schedule 06.06.2013
comment
Nitpick: UNION ALL не предлагается T-SQL. UNION ALL является частью стандарта ANSI SQL и не относится к MS SQL Server. - person Frank Schmitt; 22.06.2017
comment
Комментарий Nitpick может означать, что вы не можете использовать Union All в TSQL, но можете. Конечно, комментарий не говорит об этом, но кто-то, читающий его, может сделать вывод. - person JosephDoggie; 24.10.2018

СОЕДИНЕНИЕ - приводит к отдельным записям

в то время как

СОЕДИНЕНИЕ ВСЕ - приводит ко всем записям, включая дубликаты.

Оба являются блокирующими операторами, и поэтому я лично предпочитаю использовать 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 приводит к операциям четкой сортировки в плане выполнения. Доказательство этого утверждения показано ниже:

введите описание изображения здесь

person DBA    schedule 21.06.2016
comment
Все в этом ответе уже было сказано, слишком запутанно, чтобы быть полезным (предлагать присоединения к объединениям, когда они делают разные вещи, приводя блокировку в качестве причины, не объясняя, что вы имеете в виду или к каким серверам баз данных это относится) или очень вводит в заблуждение (ваши проценты на скриншоте не применимы к реальному использованию _1 _ / _ 2_). - person ; 21.06.2016
comment
Операторы блокировки - это хорошо известные операторы в TSQL. Все, что делают блокирующие операторы, может быть выполнено с помощью Joins, но не наоборот. Операция Distinct Sort обведена на рисунке кружком, чтобы показать, почему union all работает лучше, чем union, а также чтобы показать, где именно она существует в плане выполнения. Не стесняйтесь добавлять больше данных в таблицы T1 и T2, чтобы поэкспериментировать с процентами! - person DBA; 21.06.2016
comment
Технически вы МОЖЕТЕ получить результаты union, используя комбинацию joins и некоторых действительно неприятных cases, но это делает запрос почти невозможным для чтения и поддержки, и, по моему опыту, это также ужасно для представление. Сравните: 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
comment
@DBA Ваш ответ актуален только для пользователей MS SQL Server. OP никогда не упоминал РСУБД, которую они используют - они могут использовать MySQL, PostgreSQL, Oracle, SQLite, ... - person Frank Schmitt; 22.06.2017

Не уверен, что имеет значение, какая база данных

UNION и UNION ALL должны работать на всех серверах SQL.

Вы должны избегать ненужных UNIONs, поскольку это огромная утечка производительности. Как правило, используйте UNION ALL, если вы не уверены, что использовать.

person Jakub Šturc    schedule 08.09.2008
comment
В этом вопросе нет тега SQL Server. Я думаю, что вариант, который возвращает дубликаты только потому, что он обычно работает лучше всего, - неправильный совет. - person onedaywhen; 05.12.2016
comment
@oneday, когда я предполагаю, что OP использовал фразу SQL Servers как синоним для всех СУБД (например, MySQL, PostGreSQL, Oracle, SQL Server). Хотя формулировка неудачная (и, конечно, я могу ошибаться). - person Frank Schmitt; 22.06.2017
comment
@FrankSchmitt: ни один из перечисленных вами продуктов не является действительно СУБД :) - person onedaywhen; 14.09.2017
comment
@oneday, когда нужно уточнить? По крайней мере, en.wikipedia.org/wiki/Relational_database_management_system, похоже, согласен со мной - в нем явно упоминается Microsoft SQL Server, Oracle Database и MySQL. Или вы придираетесь к разнице между Oracle и Oracle Database, например. ? - person Frank Schmitt; 14.09.2017

union используется для выбора различных значений из двух таблиц, где как union all используется для выбора всех значений, включая дубликаты, из таблиц

person Community    schedule 15.06.2009

Это хорошо понимать с помощью диаграммы Венна.

вот ссылка < / a> к источнику. Есть хорошее описание.

введите описание изображения здесь

person michael-mammut    schedule 17.05.2016
comment
Ваше второе изображение предполагает, что эти два понятия исключают друг друга, хотя это не так. Изображение должно быть таким же, как и первое, но с «эллипсом пересечения» (), показанным во второй раз. На самом деле, если подумать, поскольку результат 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), примененные к результатам. Вы можете увидеть этот побочный эффект, когда у вас нет повторяющейся строки.

person shA.t    schedule 12.04.2015

Я добавляю пример,

ОБЪЕДИНЕНИЕ, он объединяется с отдельными -> медленнее, поскольку требует сравнения (в разработчике 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;
person Do Nhu Vy    schedule 27.04.2017

UNION объединяет содержимое двух структурно-совместимых таблиц в единую объединенную таблицу.

  • Разница:

Разница между UNION и UNION ALL заключается в том, что UNION will пропускает повторяющиеся записи, тогда как UNION ALL будет включать повторяющиеся записи.

Union Набор результатов сортируется в порядке возрастания, тогда как UNION ALL Набор результатов не сортируется

UNION выполняет DISTINCT для своего набора результатов, чтобы исключить любые повторяющиеся строки. В то время как UNION ALL не удаляет дубликаты и, следовательно, быстрее, чем _11 _. *

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

person pedram    schedule 17.05.2016
comment
Набор результатов объединения сортируется в порядке возрастания - если не указан ORDER BY, отсортированные результаты не гарантируются. Возможно, вы имеете в виду конкретного поставщика SQL (даже тогда, в порядке возрастания, что именно ...?), Но в этом вопросе нет тегов vendor = specific. - person onedaywhen; 05.12.2016
comment
объединяет содержимое двух структурно совместимых таблиц - я думаю, вы очень хорошо изложили эту часть :) - 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.

person reza.cse08    schedule 07.06.2016
comment
Действительно? За четырехрядный результат ?! Я бы подумал, что это сценарий, в котором вы захотите использовать UNION для передачи намерения (т.е. без дубликатов), потому что UNION ALL вряд ли даст какой-либо реальный прирост производительности в абсолютном выражении. - person onedaywhen; 05.12.2016

Еще кое-что хотелось бы добавить -

Объединение: набор результатов отсортирован в порядке возрастания.

Объединить все: - набор результатов не отсортирован. Два вывода запроса просто добавляются.

person Rahul Sawant    schedule 30.05.2015
comment
Правда ! UNION может изменить порядок двух подрезультатов. - person theor; 29.09.2015
comment
Это не правильно. UNION НЕ сортирует результат в порядке возрастания. Любое упорядочивание, которое вы видите в результате без использования order by, является чистым совпадением. СУБД может использовать любую стратегию, которая, по ее мнению, эффективна для удаления дубликатов. Этот может быть сортировкой, но это также может быть алгоритм хеширования или что-то совершенно иное - и стратегия будет меняться с количеством строк. union, который отображается отсортирован по 100 строкам, может не иметь 100 000 строк. - person a_horse_with_no_name; 27.04.2016
comment
Без предложения ORDER BY в запросе СУБД может возвращать строки в любой последовательности. Наблюдение за тем, что набор результатов операции UNION возвращается в порядке возрастания, является лишь побочным продуктом уникальной операции сортировки, выполняемой базой данных. Наблюдаемое поведение не гарантируется. Так что не надейтесь на это. Если спецификация должна возвращать строки в определенном порядке, добавьте соответствующее предложение 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 строк

с точки зрения приоритета оба имеют одинаковый приоритет.

person Pawan Kumar    schedule 22.01.2014

Если ORDER BY нет, UNION ALL может возвращать строки по мере их поступления, тогда как UNION заставит вас ждать до самого конца запроса, прежде чем сразу дать вам весь набор результатов. Это может иметь значение в ситуации тайм-аута - UNION ALL как бы поддерживает соединение.

Поэтому, если у вас есть проблема с тайм-аутом, нет сортировки и дубликаты не являются проблемой, UNION ALL может оказаться весьма полезным.

person AjV Jsy    schedule 03.03.2016
comment
Но ваша первая порция результатов может быть одной строкой, дублированной много раз: насколько это полезно ?! - person onedaywhen; 05.12.2016

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

Команда UNION выбирает различную и связанную информацию из двух таблиц, что устраняет повторяющиеся строки.

С другой стороны, команда UNION ALL выбирает все значения из обеих таблиц, в которых отображаются все строки.

person Sona Rijesh    schedule 16.11.2012

Важный! Разница между 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!

person Aris Mist    schedule 11.12.2018
comment
Это не правильно. 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 не будет.

person Dowlers    schedule 21.10.2019