SQL оператор UNION ALL
У цьому навчальному матеріалі ви дізнаєтесь, як використовувати SQL оператор UNION ALL з синтаксисом та прикладами.
Опис
SQL оператор UNION ALL використовується для об'єднання результуючих наборів із двох або більше операторів SELECT. Він не видаляє рядки, що повторюються, між різними операторами SELECT (повертаються всі рядки).
Кожен оператор SELECT UNION ALL повинен мати однакову кількість полів у наборах результатів з однаковими типами даних.
У чому різниця між UNION та UNION ALL?
- Оператор UNION видаляє рядки, що повторюються.
- UNION ALL не видаляє рядки, що повторюються
Синтаксис
Синтаксис для оператора UNION ALL у SQL.
SELECT expression1, expression2, . expression_n
FROM tables
[WHERE conditions]
UNION ALL
SELECT expression1, expression2, . expression_n
FROM tables
[WHERE conditions];
Параметри чи аргумент
expression1 , expression2 , expression_n Стовпці або розрахунки, які ви хочете отримати таблиці Таблиці, з яких ви хочете отримати записи. У реченні FROM повинна бути вказана хоча б одна таблиця WHERE conditions Необов'язковий. Умови, які мають бути виконані для записів, які будуть вибрані
Примітка
- В обох запитах SELECT має бути однакова кількість виразів
- Відповідні вирази повинні мати однаковий тип даних у запитах SELECT. Наприклад: expression1 повинен мати однаковий тип даних як у першому, так і другому операторі SELECT
- Також дивіться оператор UNION
Приклад - одиночне поле з тим самим ім'ям
Погляньмо, як використовувати SQL оператор UNION ALL, який повертає одне поле. У цьому простому прикладі поле в обох операторах SELECT матиме однакове ім'я та тип даних.
Наприклад.
Цей SQL приклад UNION ALL буде повертати supplier_id кілька разів у наборі результатів, якщо це значення з'явилося в таблицях suppliers і orders . SQL оператор UNION ALL не видаляє дублікати. Якщо ви бажаєте видалити дублікати, спробуйте використати оператор UNION.
Тепер розглянемо цей приклад, далі наведемо деякі дані.
Якщо у вас була таблиця suppliers, заповнена наступними записами.
| supplier_id | supplier_name |
|---|---|
| 1000 | Microsoft |
| 2000 | Oracle |
| 3000 | Apple |
| 4000 | Samsung |
Та таблиця orders заповнена наступними записами.
| order_id | order_date | supplier_id |
|---|---|---|
| 2019-07-01 | 2000 | |
| 2019-07-01 | 6000 | |
| 2019-07-02 | 7000 | |
| 2019-07-03 | 8000 |
І ви виконали наступний оператор UNION ALL.
Ви отримаєте такі результати.
Як видно з цього прикладу, UNION ALL взяв усі значення supplier_id з таблиці suppliers , і навіть з таблиці orders і повернув комбінований набір результатів. Дублікати не були видалені, як ви можете бачити значення supplier_id 2000, яке двічі з'являється в наборі результатів.
Приклад – різні імена полів
Немає необхідності, щоб відповідні стовпці в кожному операторі SELECT мали однакові імена, але вони мають бути з однаковими типами даних.
Якщо у вас немає однакових імен стовпців в операторах SELECT, це стає трохи складніше, особливо якщо ви хочете впорядкувати результати запиту за допомогою оператора ORDER BY.
Давайте подивимося, як використовувати оператор UNION ALL із різними іменами стовпців, та впорядкувати результати запиту.
Наприклад.
SQL - UNION vs UNION ALL
Доброго дня, майбутні ентузіасти SQL! Сьогодні ми відправимося у захоплюючу подорож у світ SQL, конкретно focusing на двох потужних операторах: UNION та UNION ALL. Як ваш доброзичливий 邻居-викладач комп'ютерних наук з багаторічним досвідом, я тут, щоб направити вас через ці концепції з ясністю, гумором та безліччю реальних прикладів. Так що lets dive in!
Що таке UNION?
Визначення та базова концепція
UNION resembles a master chef kombining ingredients from different recipes to create a unique dish.У термінах SQL це оператор, який дозволяє нам combine результативні набори двох або більше SELECT запитів в один результативний набір.
Ось базова синтаксика:
SELECT column1, column2, . FROM table1 UNION SELECT column1, column2, . FROM table2;
Основні особливості UNION
- Унікальні результати: UNION автоматично видаляє рядки, що дублюються, з кінцевого результативного набору.
- Сумісність стовпців: SELECT запити повинні мати таку ж кількість стовпців і ці стовпці повинні мати сумісні типи даних.
- Порядок стовпців: Порядок стовпців у SELECT запитах має значення, тому що вони поєднуються на основі свого положення.
UNION у дії
Уявимо, що ми маємо дві таблиці: fruits і vegetables . Ми хочемо створити комбінований список всіх продуктів.
- таблиця fruits CREATE TABLE fruits (id INT, name VARCHAR(50), color VARCHAR(20)); INSERT INTO fruits VALUES (1, 'Apple', 'Red'), (2, 'Banana', 'Yellow'), (3, 'Orange', 'Orange'); - таблиця vegetables CREATE TABLE vegetables (id INT, name VARCHAR(50), color VARCHAR(20)); INSERT INTO vegetables VALUES (1, 'Carrot', 'Orange'), (2, 'Broccoli', 'Green'), (3, 'Tomato', 'Red'); -- UNION запит SELECT name, color FROM fruits UNION SELECT name, color FROM vegetables;
Цей запит дасть нам:
| name | color |
|---|---|
| Apple | Red |
| Banana | Yellow |
| Orange | Orange |
| Carrot | Orange |
| Broccoli | Green |
| Tomato | Red |
Зверніть увагу, що у нас є тільки один запис 'Orange', навіть незважаючи на те, що він 出现在 в обох таблицях. Це магія UNION – він видаляє дублікати!
Що таке UNION ALL?
Визначення та базова концепція
Тепер зустрічайте entusiastic cousin UNION, UNION ALL. В той час як UNION resembles a careful chef, який видаляє інгредієнти, що дублюються, UNION ALL resembles a chef, який believes "більше - краще!"
Синтаксис аналогічний UNION:
SELECT column1, column2, . FROM table1 UNION ALL SELECT column1, column2, . FROM table2;
Основні особливості UNION ALL
- Збереження дублікатів: UNION ALL зберігає всі рядки, включаючи дублікати.
- Вища продуктивність: Оскільки він не видаляє дублікати, UNION ALL зазвичай швидше, ніж UNION.
- Сумісність стовпців: Як і UNION, він вимагає такої ж кількості стовпців із сумісними типами даних.
UNION ALL у дії
Давайте знову використовуємо наші таблиці fruits і vegetables:
SELECT name, color FROM fruits UNION ALL SELECT name, color FROM vegetables;
Цей запит дасть нам:
| name | color |
|---|---|
| Apple | Red |
| Banana | Yellow |
| Orange | Orange |
| Carrot | Orange |
| Broccoli | Green |
| Tomato | Red |
Зверніть увагу, що у нас тепер є два записи 'Orange' - один з fruits і один з vegetables. UNION ALL зберігає всі рядки, включаючи дублікати!
UNION vs UNION ALL:
Щоб дійсно зрозуміти різницю, порівняємо їх side by side:
| Feature | UNION | UNION ALL |
|---|---|---|
| Обробка дублікатів | Видаляє дублікати | Зберігає всі дублікати |
| Продуктивність | Повільніше (через видалення дублікатів) | Швидше |
| Розмір результативного набору | Потенційно менше | Потенційно більше |
| Сценарій використання | Коли потрібні унікальні результати | Коли потрібні всі результати, включаючи дублікати |
Коли використовувати UNION
Використовуйте UNION, коли вам потрібно поєднувати результати з декількох запитів і ви хочете переконатися, що кожен рядок в result set є унікальним. Це ідеально підходить для таких сценаріїв, як:
- Поєднуючи клієнтські списки з різних регіонів, переконавшись, що немає дублікатів.
- Об'єднання каталогів товарів від різних постачальників, видаляючи позиції, що дублюються.
Коли використовувати UNION ALL
Вибирайте UNION ALL, коли:
- Ви знаєте, що у ваших наборах даних немає дублікатів.
- Ви хочете зберегти всі рядки, включаючи дублікати.
- Продуктивність має пріоритет, і ви працюєте з великими наборами даних.
Практичні приклади
Давайте поринемо в деякі реальні сценарії, щоб окреслити наше розуміння.
Приклад 1: Довідник співробітників
Уявимо, що ми маємо дві таблиці: current_employees і former_employees . Ми хочемо створити comprehensive directory.
-- Створення та заповнення таблиць CREATE TABLE current_employees (id INT, name VARCHAR(50), department VARCHAR(50)); CREATE TABLE former_employees (id INT, name VARCHAR(50), department VARCHAR(50)); INSERT INTO current_employees VALUES (1, 'Alice', 'HR'), (2, 'Bob', 'IT'), (3, 'Charlie', 'Finance'); INSERT INTO former_employees VALUES (4, 'David', 'Marketing'), (5, 'Eve', 'IT'), (2, 'Bob', 'IT'); -- Bob працював тут, пішов, і повернувся -- UNION запит SELECT name, department FROM current_employees UNION SELECT name, department FROM former_employees; -- UNION ALL запит SELECT name, department FROM current_employees UNION ALL SELECT name, department FROM former_employees;
Запит UNION покаже Bob лише один раз, тоді як UNION ALL покаже Bob двічі.
Приклад 2: Звіт про продаж
Давайте створимо звіт про продажі, combining онлайн та офлайн продажу.
-- Створення та заповнення таблиць CREATE TABLE online_sales (product VARCHAR(50), amount DECIMAL(10,2)); CREATE TABLE store_sales (product VARCHAR(50), amount DECIMAL(10,2)); INSERT INTO online_sales VALUES ('Laptop', 1200.00), ('Phone', 800.00), ('Tablet', 500.00); INSERT INTO store_sales VALUES ('Laptop', 1100.00), ('Phone', 750.00), ('Headphones', 200.00); -- Total unique products sold (UNION) SELECT product FROM online_sales UNION SELECT product FROM store_sales; -- All sales entries (UNION ALL) SELECT 'Online' AS source, product, amount FROM online_sales UNION ALL SELECT 'Store' AS source, product, amount FROM store_sales;
Запит UNION дасть нам список унікальних товарів, проданих по обох каналах, у той час як UNION ALL надасть список усіх операцій продажів.
Висновок
І ось ми тут, мої дорогі студенти! Ми вирушили в подорож землями UNION і UNION ALL, explored їх подібності, відмінності та реальні програми. Пам'ятайте, UNION - ваш вибір для унікальних, deduplicated результатів, в той час як UNION ALL - ваш швидкий друг, коли вам потрібні всі дані, включаючи дублікати.
Поки ви продовжуєте свою пригоду в SQL, ви знайдете багато можливостей використовувати ці потужні інструменти. Як і в кулінарії, знання того, коли використати кожен інструмент (або в нашому випадку, оператор), ключ до створення ідеального запиту.
Продовжуйте практикуватися, stay curious, і не бійтеся експериментувати з цими концепціями. Before you know it, ви будете використовувати UNION та UNION ALL як профі! Happy querying!
Credits: Image by storyset
У чому різниця між UNION та UNION ALL?
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)
Наслідком цього є те, що об'єднання є набагато менш продуктивним, оскільки воно має сканувати результати на наявність дублікатів.
UNION ALL дійсно буде більш продуктивним, особливо через відсутність чіткого сортування. Моя загальна практика полягає в тому, щоб використовувати UNION ALL, якщо я спеціально не хочу дублікатів.
Просто помітив, що тут багато хороших коментарів/відповідей, тому я увімкнув прапор вікі і додав замітку про продуктивність.
UNION ALL може працювати повільніше, ніж UNION у реальних випадках, коли мережа, така як Інтернет, є вузьким місцем. Вартість передачі безлічі рядків, що повторюються, може перевищити виграш у часі виконання запиту. Це має бути проаналізовано у кожному конкретному випадку.
І UNION, і UNION ALL поєднують результат двох різних SQL. Вони відрізняються тим, як вони обробляють дублікати.
- UNION виконує DISTINCT для набору результатів, усуваючи будь-які рядки, що дублюються.
- UNION ALL не видаляє дублікати, тому він працює швидше, ніж UNION.
Примітка. При використанні цієї команди усі вибрані стовпці мають бути одного типу даних.
Приклад: якщо у нас є дві таблиці: 1) співробітник та 2) клієнт
- Приклад UNION ALL (він просто поєднує записи, а не видаляє дублікати, тому він працює швидше, ніж UNION):
«Всі обрані стовпці повинні бути одного типу даних» - насправді, все не так вже й строго (не дуже хороша річ з погляду реляційної моделі!). Стандарт SQL каже, що їх відповідний дескриптор стовпця має бути таким самим, за винятком імені.
UNION видаляє дублікати, а UNION ALL не видаляє .
Щоб видалити дублікати, результуючий набір має бути відсортований, і це може вплинути на продуктивність UNION залежно від обсягу сортованих даних і налаштувань різних параметрів СУБД (для Oracle PGA_AGGREGATE_TARGET з WORKAREA_SIZE_POLICY=AUTO або SORT_AREA_SIZE та SOR_AREA_RETAINED_SIZE якщо WORKAREA_SIZE_POLICY=MANUAL)
По суті, сортування виконується швидше, якщо воно може бути виконане в пам'яті, але застосовується те ж застереження щодо обсягу даних.
Звичайно, якщо вам потрібні дані, повернуті без дублікатів, ви повинні використовувати UNION, залежно від джерела даних.
Я б прокоментував першу посаду, щоб кваліфікувати коментар «набагато менш ефективний», але в мене недостатньо репутації (балів) для цього.
"Щоб видалити дублікати, набір результатів має бути відсортований" - можливо, ви маєте на увазі конкретного постачальника, але в питанні немає специфічних для нього тегів. Навіть якби було, чи могли б ви довести, що дублікати не можуть бути видалені без сортування?
Different «неявно» сортуватиме результати, тому що видалення сортування відбувається швидше у відсортованому наборі. це не означає, що повернений набір результатів фактично сортується таким чином, але в більшості випадків різні (і, отже, UNION) внутрішньо сортуватимуть набір результатів.
У ORACLE: UNION не підтримує типи стовпців BLOB (або CLOB), UNION ALL підтримує.
Основна відмінність між UNION і 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.
Це пропустить рядки і, отже, не дасть очікуваного результату, якщо містить значення NULL. Крім того, він, як і раніше, не повертає той же результат, що і UNION - UNION також видаляє дублікати, які повертаються підзапитами, тоді як ваш підхід не буде.
@FrankSchmitt - дякую за цю відповідь; цей біт про підзапит - саме те, що я хотів знати!Просто додайте мої два центи до обговорення тут: можна зрозуміти оператор UNION як чистий, SET-орієнтований UNION - наприклад, set A = , set B = , A UNION B =
При роботі з наборами ви не хотіли б, щоб числа 2 і 4 з'являлися двічі, оскільки елемент або є, або відсутня у наборі.
Однак у світі SQL ви можете захотіти побачити всі елементи з двох наборів в одній сумці. І для цього T-SQL пропонує оператору UNION ALL.
Nitpick: UNION ALL не "пропонується" T-SQL. UNION ALL є частиною стандарту ANSI SQL і не належить до MS SQL Server.
Коментар Nitpick може означати, що ви не можете використовувати "Union All" у TSQL, але можете це зробити. Звичайно, коментар не говорить про цьому, але хтось, хто читає його, може дійти невтішного висновку.
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 тому що це величезний витік продуктивності. Як правило, використовуйте UNION ALL якщо ви не впевнені, який використовувати.
У цьому питанні немає тегу SQL Server. Я думаю, що варіант, який повертає дублікати лише тому, що він зазвичай працює найкраще, є неправильною порадою.
@onedaywhen Я вважаю, що OP використовував фразу «SQL-сервери» як синонім для всіх РСУБД (наприклад, MySQL, PostGreSQL, Oracle, SQL Server). Формулювання невдале, хоча (і, звичайно, я можу помилятися).
@FrankSchmitt: жоден з перерахованих вами продуктів не є справжніми СУБД :)@oneday коли хочете уточнити? Принаймні en.wikipedia.org/wiki/Relational_database_management_system, схоже, згоден зі мною – у ній явно згадуються Microsoft SQL Server, Oracle Database та MySQL. Чи ви прискіпливі до різниці між Oracle та Oracle Database, наприклад?
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 призводить до різних операцій сортування у плані виконання. Доказ, щоб довести це твердження, показано нижче:
Все, що в цій відповіді вже було сказано, занадто заплутано, щоб бути корисним (пропонуючи об'єднання з профспілок, коли вони роблять різні речі, приводячи як причину «блокування», не пояснюючи, що ви маєте на увазі під тим чи до яких серверів баз даних це відноситься), або вводить в оману (ваші відсотки на скріншоті не відповідають реальному фактичному використанню UNION / UNION ALL).
Оператори блокування - це добре відомі оператори TSQL. Все, що роблять оператори блокування, може бути досягнуто об'єднаннями, але не навпаки. Операцію «Різне сортування» обведено на малюнку, щоб показати, чому об'єднання всіх працює краще, ніж об'єднання, а також точно показати, де воно існує в плані виконання. Не соромтеся додавати більше даних у таблиці T1 та T2, щоб пограти з відсотками!
Технічно, ви МОЖЕТЕ отримати результати 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
@DBA Ваша відповідь актуальна лише для користувачів MS SQL Server. ВП ніколи не згадував СУБД, які вони використовують – вони можуть використовувати MySQL, PostgreSQL, Oracle, SQLite, .
об'єднання використовується для вибору різних значень із двох таблиць, де як об'єднання все використовується для вибору всіх значень, включаючи дублікати з таблиць
Це добре зрозуміти за допомогою діаграми Венна.
ось посилання на джерело. Є добрий опис.
Ваше друге зображення показує, що вони є взаємовиключними, коли це не так. Картинка повинна показувати те саме, що й перша, але з «еліпсом перетину», () показаним вдруге. Насправді, якщо подумати, оскільки union all результат не є набором, ви не повинні намагатися намалювати його за допомогою діаграми Венна!
(З електронної книги з 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) стосовно результатів. Ви можете побачити цей побічний ефект, коли у вас немає рядків, що повторюються.
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;
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 = specific.
"об'єднує вміст двох структурно-сумісних таблиць" - я думаю, що ви дійсно добре виклали цю частину :)
Припустимо, що у вас є два столи Вчитель і учень
Обидва мають 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 навряд чи вийде будь-який реальний приріст продуктивності в абсолютному вираженні.
Простіше кажучи, різниця між UNION та UNION ALL полягає в тому, що UNION пропускатиме дублікати записів, тоді як UNION ALL включатиме дублікати записів.
Ще одна річ, яку я хотів би додати:
Об'єднання : - Набір результатів сортується у порядку зростання.
Об'єднання всіх : - Набір результатів не відсортовано. виведення двох запитів просто додається.
Це не так. UNION Буде НЕ сортувати результат у порядку зростання. Будь-який порядок, який ви бачите в результаті без використання, order by є чистим збігом. СУБД може вільно використовувати будь-яку стратегію, яку вона вважає ефективною видалення дублікатів. Це може бути сортування, але це також може бути алгоритм хешування або щось зовсім інше - і стратегія змінюватиметься в залежності від кількості рядків. A, union котрий виглядає відсортованим за 100 рядками, може не співпадати зі 100 000 по рядках
Без пропозиції ORDER BY у запиті СУБД може повертати рядки в будь-який послідовності. Зауваження про те, що набір результатів операції UNION повертається «у порядку зростання», є лише побічним продуктом операції «унікальне сортування», яку виконує база даних. Спостережена поведінка не гарантується. Тож не сподівайся на це. Якщо специфікація повинна повертати рядки в певному порядку, додайте відповідну ORDER BY пропозицію.
Різниця між Союзом проти Союзу ВСІМ у 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
Важливий! Різниця між 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 повторюватимуться рядки!
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 , a 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
Цей тип дзвінка geometry cannot be used як operand to UNION, INTERSECT or EXCEPT operators because it is not comparable.
Однак union all не буде.
Єдина різниця полягає в наступному:
«UNION» видаляє рядки, що повторюються.
«UNION ALL» не видаляє рядки, що повторюються.
