Чим відрізняється UNION від UNION ALL?


Відповіді:


1734

UNIONвидаляє дублікати записів (де всі стовпці в результатах однакові), UNION ALLне робить.

Під час використання UNIONзамість цього використовується хіт продуктивностіUNION ALL , оскільки сервер бази даних повинен виконати додаткову роботу для видалення дублікатів рядків, але дублікатів зазвичай не потрібно (особливо при розробці звітів).

Приклад об'єднання:

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar

Результат:

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)

Приклад СПІЛЬНОГО ВСІХ:

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, якщо я спеціально не хочу копій.
Adam Caviness

6
Щойно помітив, що тут є багато хороших коментарів / відповідей, тому я увімкнув прапор wiki і додав примітку про продуктивність ...
Jim Harte

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, залежно від обсягу відсортованих даних та налаштування різних параметрів RDBMS (для Oracle PGA_AGGREGATE_TARGETз WORKAREA_SIZE_POLICY=AUTOабо SORT_AREA_SIZEі SOR_AREA_RETAINED_SIZEякщо WORKAREA_SIZE_POLICY=MANUAL).

В основному, сортування швидше, якщо його можна здійснити в пам'яті, але застосовується однаковий застереження щодо обсягу даних.

Звичайно, якщо вам потрібні дані, повернені без дублікатів, тоді ви повинні використовувати UNION, залежно від джерела ваших даних.

Я б прокоментував перший пост, щоб кваліфікувати коментар "набагато менш ефективний", але маю недостатню репутацію (бали) для цього.


1
"Для видалення дублікатів набір результатів повинен бути відсортований" - можливо, ви маєте на увазі конкретного постачальника, але немає тегів, що стосуються конкретного постачальника. Навіть якби це було, чи можете ви довести, що дублікати не можна видалити без сортування?
день, коли

2
різний буде "неявно" сортувати результати, оскільки видалення дублікатів швидше на відсортованому наборі. це не означає, що повернутий набір результатів насправді сортується таким чином, але в більшості випадків різний (і, отже, 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деталь. Це набагато швидше, ніж СОЮЗ.


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

@FrankSchmitt - дякую за цю відповідь; цей біт про підзапити - це саме те, що я хотів знати!
Дорадус

11

Просто додати тут два мої центи до дискусії: можна було зрозуміти UNION оператора як чистий, орієнтований на СЕЮТ, наприклад, набір A = {2,4,6,8}, B = {1,2,3,4 }, Спілка 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 ALLT-SQL не пропонується. UNION ALLє частиною стандарту ANSI SQL і не є специфічним для MS SQL Server.
Френк Шмітт

1
Коментар "Nitpick" може означати, що ви не можете використовувати "Union All" в TSQL, але ви можете. Звичайно, коментар цього не говорить , але хтось, хто його читає, може зробити це висновком.
ДжозефДоггі

10

UNION команда використовується для вибору відповідної інформації з двох таблиць, так само, як команда. Однак при використанні команди всі вибрані стовпці повинні бути одного типу даних. З , вибираються лише окремі значення.
UNIONJOINUNIONUNION

UNION ALL команда дорівнює команді, за винятком того, що
UNION ALLUNIONUNION ALL вибирає всі значення.

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

UNIONЗаява ефективно робить SELECT DISTINCTна безлічі результатів. Якщо ви знаєте, що всі повернуті записи є унікальними для вашого союзу, використовуйте UNION ALLнатомість це дає швидші результати.


8

Не впевнений, що має значення, яка база даних

UNIONі UNION ALLповинен працювати на всіх серверах SQL.

Вам слід уникати зайвих UNIONs - це величезні витоки продуктивності. Як правило, використовуйте великий палець, UNION ALLякщо ви не впевнені, що використовувати.


У цьому питанні немає тегу SQL Server. Я думаю, що варіант, який повертає дублікати лише тому, що зазвичай найкраще працює, - це неправильна порада.
день, коли

1
@onedaywhen Я думаю, що ОП використовувала фразу "SQL-сервери" як синонім для всіх RDBMS (наприклад, MySQL, PostGreSQL, Oracle, SQL Server). Формулювання прикро, хоча (і, звичайно, я можу помилитися).
Френк Шмітт

@FrankSchmitt: жоден із перелічених вами продуктів не є справді RDBMS :)
onedaywhen

1
@onedaywhen хочете допрацювати? Принаймні 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 тощо) будь-коли.

Щоб проілюструвати, чому операція Союзу працює погано порівняно з Checkout 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. Все, що блокують оператори, може досягти Joins, але не навпаки. Операція чіткого сортування зображена на малюнку, щоб показати, чому об'єднання працює краще, ніж об'єднання, а також точно вказати, де він існує в плані виконання. Не соромтеся додавати більше даних у таблиці 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. ОП ніколи не згадував про RDBMS, які вони використовують - вони можуть використовувати MySQL, PostgreSQL, Oracle, SQLite, ...
Frank Schmitt

6

union використовується для вибору відмінних значень з двох таблиць, де як union all використовується для вибору всіх значень, включаючи дублікати з таблиць


6

Це добре зрозуміти за схемою Венна.

ось посилання на джерело. Є хороший опис.

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


5
Ваша друга картина говорить про те, що обидві взаємно виключають, коли їх немає. Малюнок повинен виглядати так само, як перший, але із "еліпсом перетину", ()показаним вдруге. Насправді, з другої думки, оскільки union allрезультат не є набором, не слід намагатися намалювати його за допомогою діаграми Венна!
день, коли

5

(З Microsoft SQL Server Book 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)застосовані до результатів. Цей побічний ефект можна побачити, коли у вас немає жодного повторюваного рядка.


5

Я додаю приклад,

UNION , він зливається з чітким -> повільнішим, тому що йому потрібно порівняти (У розробнику 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;

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 =.
одного дня, коли

"об'єднує вміст двох структурно сумісних таблиць" - Я думаю, ви справді добре заявили цю частину :)
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 таблицях). Подобається це

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 All : - Набір результатів не сортується. два запити виходу просто додаються.


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

6
Це неправильно. А НЕUNION буде сортувати результат у порядку зростання. Будь-яке замовлення, яке ви бачите в результаті без використання - це чистий збіг. СУБД вільна використовувати будь-яку стратегію, яку вважає ефективною для видалення дублікатів. Це може бути сортуванням, але це також може бути алгоритм хешування або щось зовсім інше - і стратегія буде змінюватися з кількістю рядків. , Що з'являється відсортованих з 100 рядками може не бути з 100.000 рядківorder byunion
a_horse_with_no_name

2
Без пункту ORDER BY у запиті RDBMS може повертати рядки в будь-якій послідовності. Спостереження про те, що результат, отриманий в результаті операції UNION, повертається "у порядку зростання" - лише побічний продукт "унікальної унікальної" операції, виконаної базою даних. Поведінка, що спостерігається, не гарантується. Тому не покладайтеся на це. Якщо специфікація повинна повертати рядки в певному порядку, то додайте відповідне ORDER BYзастереження.
spencer7593

1

Різниця між Союзом VS Союз ВСІМ у кв

Що таке об'єднання в 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

Союз Vs Союз усіх із прикладом


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 ВСЕ отримує всі рядки з обох таблиць. Те саме відбудеться і в MySQL.

Однак:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

В ORACLE , UNION витягує всі рядки з обох таблиць, оскільки між т1 та 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, то 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
Як це додає значення в порівнянні з прийнятою відповіддю?
Нік

@ Nick Це коротша відповідь.
Мостафа Ватанпур

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