Відповіді:
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)
І UNION, і UNION ALL об'єднують результат двох різних SQL. Вони відрізняються тим, як обробляють дублікати.
UNION виконує DISTINCT на наборі результатів, усуваючи всі повторювані рядки.
UNION ALL не видаляє дублікати, і тому швидше, ніж UNION.
Примітка. Під час використання цих команд усі вибрані стовпці повинні бути одного типу даних.
Приклад: Якщо у нас є дві таблиці, 1) Співробітник та 2) Замовник




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, залежно від джерела ваших даних.
Я б прокоментував перший пост, щоб кваліфікувати коментар "набагато менш ефективний", але маю недостатню репутацію (бали) для цього.
В ORACLE: UNION не підтримує BLOB (або CLOB) типів стовпців, UNION ALL робить.
Основна відмінність UNION від UNION 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 оператора як чистий, орієнтований на СЕЮТ, наприклад, набір 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.
UNION ALLT-SQL не пропонується. UNION ALLє частиною стандарту ANSI SQL і не є специфічним для MS SQL Server.
UNION команда використовується для вибору відповідної інформації з двох таблиць, так само, як команда. Однак при використанні команди всі вибрані стовпці повинні бути одного типу даних. З , вибираються лише окремі значення.UNIONJOINUNIONUNION
UNION ALL команда дорівнює команді, за винятком того, щоUNION ALLUNIONUNION ALL вибирає всі значення.
Різниця між Unionі в Union allтому, що Union allне усуває повторюваних рядків, натомість вона просто витягує всі рядки з усіх таблиць, що відповідають вашим запитам запитів, і об'єднує їх у таблицю.
UNIONЗаява ефективно робить SELECT DISTINCTна безлічі результатів. Якщо ви знаєте, що всі повернуті записи є унікальними для вашого союзу, використовуйте UNION ALLнатомість це дає швидші результати.
Не впевнений, що має значення, яка база даних
UNIONі UNION ALLповинен працювати на всіх серверах SQL.
Вам слід уникати зайвих UNIONs - це величезні витоки продуктивності. Як правило, використовуйте великий палець, UNION ALLякщо ви не впевнені, що використовувати.
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 призводить до операцій із чітким сортуванням у Плані виконання. Підтвердження цього доказу наведено нижче:
UNION/ UNION ALL).
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
union використовується для вибору відмінних значень з двох таблиць, де як union all використовується для вибору всіх значень, включаючи дублікати з таблиць
()показаним вдруге. Насправді, з другої думки, оскільки union allрезультат не є набором, не слід намагатися намалювати його за допомогою діаграми Венна!
(З 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)застосовані до результатів. Цей побічний ефект можна побачити, коли у вас немає жодного повторюваного рядка.
Я додаю приклад,
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;
UNION об'єднує вміст двох структурно сумісних таблиць в єдину комбіновану таблицю.
Різниця між UNIONі UNION ALLполягає в тому, що UNION willпропускають дублікати записів, тоді як UNION ALLбудуть включати дублікати записів.
UnionНабір результатів сортується у порядку зростання, тоді як UNION ALLнабір результатів не сортується
UNIONвиконує DISTINCTнабір результатів, щоб усунути всі повторювані рядки. Тоді UNION ALLяк копії не видаляються, тому це швидше, ніж UNION*.
Примітка : Продуктивність UNION ALL, як правило, буде кращою UNION, оскільки UNIONвимагає від сервера додаткової роботи з видалення дублікатів. Так, у випадках, коли точно визначено, що дублікатів не буде, або якщо копії не є проблемою, їх використання UNION ALLрекомендується використовувати з міркувань продуктивності.
ORDER BY, відсортовані результати не гарантуються. Можливо, ви маєте на увазі конкретного постачальника SQL (навіть тоді, порядок зростання, що саме ...?), Але це питання не має конкретних тегів vendor =.
Припустимо, у вас є дві таблиці Учитель і Учень
В обох є 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навряд чи можна отримати будь-який реальний приріст результатів життя в абсолютних показниках.
Дуже простими словами різниця між UNION та UNION ALL полягає в тому, що UNION опустить дублікати записів, тоді як UNION ALL буде включати дублікати записів.
Ще одне, що я хотів би додати -
Союз : - Набір результатів сортується у порядку зростання.
Union All : - Набір результатів не сортується. два запити виходу просто додаються.
UNION буде сортувати результат у порядку зростання. Будь-яке замовлення, яке ви бачите в результаті без використання - це чистий збіг. СУБД вільна використовувати будь-яку стратегію, яку вважає ефективною для видалення дублікатів. Це може бути сортуванням, але це також може бути алгоритм хешування або щось зовсім інше - і стратегія буде змінюватися з кількістю рядків. , Що з'являється відсортованих з 100 рядками може не бути з 100.000 рядківorder byunion
ORDER BYзастереження.
Різниця між Союзом 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
Важливо! Різниця між 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 буде дублювати рядки!
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може повернути рядки назад, тоді як a UNIONзмусить вас зачекати до самого кінця запиту, перш ніж дати вам весь результат, встановлений одразу. Це може змінити ситуацію в тайм-ауті - аUNION ALL підтримує живий зв'язок.
Тож якщо у вас є проблема з очікуванням, і сортування не існує, а дублікати - це не проблема, це UNION ALLможе бути корисним.
UNION та UNION ALL використовуються для об'єднання двох або більше результатів запитів.
Команда UNION вибирає різну та пов’язану інформацію з двох таблиць, що виключає повторювані рядки.
З іншого боку, команда UNION ALL вибирає всі значення з обох таблиць, де відображаються всі рядки.
Як звичка, Завжди використовуйте UNION ALL . Використовуйте UNION лише в особливих випадках, коли вам потрібно усунути дублікати, які можуть бути надзвичайно брудними, і про все ви можете прочитати в інших коментарях тут.
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не буде.
Єдина відмінність:
"UNION" видаляє повторювані рядки.
"UNION ALL" не видаляє повторювані рядки.