Відповіді:
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 ALL
T-SQL не пропонується. UNION ALL
є частиною стандарту ANSI SQL і не є специфічним для MS SQL Server.
UNION команда використовується для вибору відповідної інформації з двох таблиць, так само, як команда. Однак при використанні команди всі вибрані стовпці повинні бути одного типу даних. З , вибираються лише окремі значення.UNION
JOIN
UNION
UNION
UNION ALL команда дорівнює команді, за винятком того, щоUNION ALL
UNION
UNION ALL
вибирає всі значення.
Різниця між Union
і в Union all
тому, що Union all
не усуває повторюваних рядків, натомість вона просто витягує всі рядки з усіх таблиць, що відповідають вашим запитам запитів, і об'єднує їх у таблицю.
UNION
Заява ефективно робить SELECT DISTINCT
на безлічі результатів. Якщо ви знаєте, що всі повернуті записи є унікальними для вашого союзу, використовуйте UNION ALL
натомість це дає швидші результати.
Не впевнений, що має значення, яка база даних
UNION
і UNION ALL
повинен працювати на всіх серверах SQL.
Вам слід уникати зайвих UNION
s - це величезні витоки продуктивності. Як правило, використовуйте великий палець, 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
використовуючи комбінацію 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
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 by
union
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" не видаляє повторювані рядки.