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


Ответы:


1735

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)

179
Следствием этого является то, что объединение гораздо менее производительно, поскольку оно должно сканировать результаты на наличие дубликатов
Мэтью Уотсон,

19
UNION ALL действительно будет более производительным, особенно из-за отсутствия четкой сортировки. Моя общая практика состоит в том, чтобы использовать UNION ALL, если я специально не хочу дубликатов.
Адам Кэвнесс

6
Просто заметил, что здесь много хороших комментариев / ответов, поэтому я включил флаг вики и добавил заметку о производительности ...
Джим Харт

250
UNION ALL может работать медленнее, чем UNION, в реальных случаях, когда сеть, такая как Интернет, является узким местом. Стоимость передачи множества повторяющихся строк может превысить выигрыш во времени выполнения запроса. Это должно быть проанализировано в каждом конкретном случае.
Чарльз Бернс

23
@AdamCaviness Ваш комментарий не совсем имеет смысла.
kojow7

285

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

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

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

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

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

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

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

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

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

  1. Пример UNION (удаляет все дубликаты записей):

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

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

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


3
«все выбранные столбцы должны быть одного типа данных» - на самом деле, все не так уж строго (не очень хорошая вещь с точки зрения реляционной модели!). Стандарт SQL говорит, что их соответствующий дескриптор столбца должен быть таким же, за исключением имени.
понедельник,

47

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

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

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

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

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


1
«Чтобы удалить дубликаты, набор результатов должен быть отсортирован» - возможно, вы имеете в виду конкретного поставщика, но в вопросе нет специфических для него тегов. Даже если бы было, могли бы вы доказать, что дубликаты не могут быть удалены без сортировки?
понедельник,

2
Different будет «неявно» сортировать результаты, потому что удаление сортировки происходит быстрее в отсортированном наборе. это не означает, что возвращенный набор результатов фактически сортируется таким образом, но в большинстве случаев различные (и, следовательно, UNION) будут внутренне сортировать набор результатов.
DevilSuichiro



13

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

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

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


4
Это пропустит строки и, следовательно, не даст ожидаемого результата, если a содержит значения NULL. Кроме того, он по-прежнему не возвращает тот же результат, что и UNION- UNIONтакже удаляет дубликаты, которые возвращаются подзапросами, в то время как ваш подход не будет.
Франк Шмитт

@FrankSchmitt - спасибо за этот ответ; этот бит о подзапросах - именно то, что я хотел знать!
Дорадус

11

Просто добавьте мои два цента к обсуждению здесь: можно понять UNIONоператор как чистый, SET-ориентированный UNION - например, set A = {2,4,6,8}, set 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.


2
Nitpick: UNION ALLне «предлагается» T-SQL. UNION ALLявляется частью стандарта ANSI SQL и не относится к MS SQL Server.
Фрэнк Шмитт

1
Комментарий Nitpick может означать, что вы не можете использовать «Union All» в TSQL, но можете это сделать. Конечно, комментарий не говорит об этом, но кто-то, читающий его, может сделать вывод.
JosephDoggie

10

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

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

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

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


8

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

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

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


В этом вопросе нет тега SQL Server. Я думаю, что вариант, который возвращает дубликаты только потому, что он обычно работает лучше всего, является неправильным советом.
onedaywhen

1
@onedaywhen Я полагаю, что OP использовал фразу «SQL-серверы» в качестве синонима для всех РСУБД (например, MySQL, PostGreSQL, Oracle, SQL Server). Формулировка неудачная, хотя (и, конечно, я могу ошибаться).
Фрэнк Шмитт

@FrankSchmitt: ни один из перечисленных вами продуктов не является настоящими СУБД :)
до

1
@oneday когда хотите уточнить? По крайней мере en.wikipedia.org/wiki/Relational_database_management_system, похоже, согласен со мной - в ней явно упоминаются Microsoft SQL Server, Oracle Database и MySQL. Или вы придирчивы к разнице между Oracle и Oracle Database, например?
Фрэнк Шмитт

8

UNION - приводит к разным записям,

а

UNION ALL - ко всем записям, включая дубликаты.

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

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


3
Все, что в этом ответе уже было сказано, слишком запутанно, чтобы быть полезным (предлагая объединения по профсоюзам, когда они делают разные вещи, приводя в качестве причины «блокировку», не объясняя, что вы подразумеваете под тем или к каким серверам баз данных это относится), или вводит в заблуждение (ваши проценты на скриншоте не соответствуют реальному фактическому использованию UNION/ UNION ALL).

Операторы блокировки - это хорошо известные операторы в TSQL. Все, что делают операторы блокировки, может быть достигнуто объединениями, но не наоборот. Операция «Различная сортировка» обведена на рисунке, чтобы показать, почему объединение всех работает лучше, чем объединение, а также точно показать, где оно существует в плане выполнения. Не стесняйтесь добавлять больше данных в таблицы T1 и T2, чтобы поиграть с процентами!
DBA

Технически, вы МОЖЕТЕ получить результаты 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
Девин Ламот

@DBA Ваш ответ актуален только для пользователей MS SQL Server. ОП никогда не упоминал СУБД, которые они используют - они могут использовать MySQL, PostgreSQL, Oracle, SQLite, ...
Фрэнк Шмитт

6

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


6

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

вот ссылка на источник. Есть хорошее описание.

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


5
Ваше второе изображение показывает, что они взаимоисключающие, когда это не так. Картинка должна показывать то же, что и первая, но с «эллипсом пересечения», ()показанным во второй раз. На самом деле, если подумать, поскольку union allрезультат не является набором, вы не должны пытаться нарисовать его с помощью диаграммы Венна!
1

5

(Из электронной книги по Microsoft SQL Server)

СОЮЗ [ВСЕ]

Указывает, что несколько наборов результатов должны быть объединены и возвращены как один набор результатов.

ВСЕ

Включает все строки в результаты. Это включает в себя дубликаты. Если не указано, повторяющиеся строки удаляются.

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


5

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

UNION , он сливается с отличным -> медленнее, потому что его нужно сравнивать (в Oracle SQL developer, выберите запрос, нажмите F10, чтобы увидеть анализ затрат).

UNION ALL , это сливается без отчетливого -> быстрее.

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;

2

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

  • Разница:

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

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

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

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


1
«Набор результатов объединения отсортирован в порядке возрастания» - если нет ORDER BY, отсортированные результаты не гарантируются. Возможно, вы имеете в виду конкретного поставщика SQL (даже тогда, что именно в порядке возрастания ...?), Но в этом вопросе нет тегов vendor = specific.
onedaywhen

«объединяет содержимое двух структурно-совместимых таблиц» - я думаю, что вы действительно хорошо изложили эту часть :)
понедельник,

2

Предположим, что у вас есть два стола Учитель и ученик

Оба имеют 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операцию к двум таблицам, она игнорирует все повторяющиеся записи (все значения столбцов строки в таблице совпадают со значениями в другой таблице). Нравится

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

2

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


1

Еще одна вещь, которую я хотел бы добавить:

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

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


Правда ! UNION может изменить порядок двух промежуточных результатов.
gracchus 28.09.15

6
Это не верно. UNIONБудет НЕ сортировать результат в порядке возрастания. Любой порядок, который вы видите в результате без использования, order byявляется чистым совпадением. СУБД может свободно использовать любую стратегию, которую она считает эффективной для удаления дубликатов. Это может быть сортировка, но это также может быть алгоритм хеширования или что-то совершенно другое - и стратегия будет меняться в зависимости от количества строк. A, unionкоторый выглядит отсортированным по 100 строкам, может не совпадать со 100 000 по строкам
a_horse_with_no_name

2
Без предложения ORDER BY в запросе СУБД может возвращать строки в любой последовательности. Замечание о том, что набор результатов операции UNION возвращается «в порядке возрастания», является только побочным продуктом операции «уникальная сортировка», выполняемой базой данных. Наблюдаемое поведение не гарантируется. Так что не надейся на это. Если спецификация должна возвращать строки в определенном порядке, то добавьте соответствующее ORDER BYпредложение.
spencer7593

1

Разница между Союзом против Союза ВСЕМ в Sql

Что такое объединение в SQL?

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

Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order

Союз против Союза все с примером


1

Важный! Разница между 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 будут повторяться строки!


0

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 строк

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


0

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

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


Но ваш первый кусок результатов может быть многократно дублирован на одну строку: насколько это полезно ?!
понедельник,

0

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

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

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


0

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


0

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не будет.


-1

Единственная разница заключается в следующем:

«UNION» удаляет повторяющиеся строки.

«UNION ALL» не удаляет повторяющиеся строки.


13
Как это добавляет ценность по сравнению с принятым ответом?
Ник

@ Ник Это более короткий ответ.
Мостафа Ватанпур

Короче может быть преимуществом, если вам пришлось прочитать значительную часть принятого ответа, чтобы получить эти данные. Но в этом случае принятый ответ содержит всю эту информацию в самом первом предложении, после чего он подробно обсуждает последствия различий.
dmckee --- котенок экс-модератора
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.