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

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

w3schools.com/sql/sql_union.asp
Shiwangini 07.05.2019 10:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1 485
1
1 380 740
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

The basic difference between UNION and UNION ALL is union operation eliminates the duplicated rows from the result set but union all returns all rows after joining.

от http://zengin.wordpress.com/2007/07/31/union-vs-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)

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

Matthew Watson 09.09.2008 03:55

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

Adam Caviness 11.07.2011 19:51

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

Jim Harte 13.07.2011 17:16

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

Charles Burns 05.04.2012 02:38

Также кажется, что это влияет на порядок сортировки по умолчанию. Например. 'select 9 union select 8 union select 7' возвращает результаты в обратном порядке, чтобы 'выбрать 9 объединить все выбрать 8 объединить все выбрать 7'.

Nine Tails 08.09.2015 17:33

@CharlesBurns, это привело бы нас к необходимости знать пороговое значение количества повторяющихся записей по сравнению с общим количеством возвращенных записей, что делает штраф за их удаление перевешивает потери производительности при их передаче по сети или наоборот. На мой взгляд, с точки зрения механизма базы данных, здесь нет сомнений в том, что UNION ALL предпочтительнее. Затем при необходимости следует оптимизировать сетевой трафик.

Jaime 09.11.2015 16:11

Еще одно отличие, кажется, заключается в порядке результатов. UNION изменяет порядок результатов, а UNION ALL - нет.

Mariusz 09.02.2017 18:29

@AdamCaviness Ваш комментарий не совсем понятен.

kojow7 17.09.2017 07:03

UNION vs UNION ВСЕ различия в производительности зависят от ограничений, оптимизации и т. д. Общий совет - использовать UNION только тогда, когда вы явно хотите удалить дубликаты.

jarlh 24.11.2017 16:17

@Mariusz В таблице нет порядка, включая результат объединения или объединения всех. Наборы результатов упорядочиваются в крайнем порядке по.

philipxy 10.02.2021 16:50

Not sure that it matters which database

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

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

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

onedaywhen 05.12.2016 12:02

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

Frank Schmitt 22.06.2017 10:05

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

onedaywhen 14.09.2017 13:35

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

Frank Schmitt 14.09.2017 16:00

В ORACLE: UNION не поддерживает типы столбцов BLOB (или CLOB), UNION ALL поддерживает.

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

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

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

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

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

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

onedaywhen 05.12.2016 11:51

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

DevilSuichiro 25.10.2017 11:01

объединение используется для выбора различных значений из двух таблиц где как 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.

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

Frank Schmitt 19.09.2017 09:57

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

Doradus 16.03.2018 01:55

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

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

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

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

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

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

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

Note: While using this commands all selected columns need to be of the same data type.

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

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

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

  1. Пример UNION (удаляет все повторяющиеся записи):

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

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

onedaywhen 05.12.2016 12:13

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

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

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

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

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

Frank Schmitt 22.06.2017 10:08

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

JosephDoggie 24.10.2018 22:41

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

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

(Из книги Microsoft SQL Server Online)

СОЮЗ [ВСЕ]

Specifies that multiple result sets are to be combined and returned as a single result set.

ВСЕ

Incorporates all rows into the results. This includes duplicates. If not specified, duplicate rows are removed.

UNION займет слишком много времени, поскольку к результатам применяется поиск повторяющихся строк, например DISTINCT.

SELECT * FROM Table1
UNION
SELECT * FROM Table2

эквивалентно:

SELECT DISTINCT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2) DT

A side effect of applying DISTINCT over results is a sorting operation on results.

Результаты UNION ALL будут отображаться в порядке произвольный результатов. Но результаты UNION будут отображаться как ORDER BY 1, 2, 3, ..., n (n = column number of Tables), примененный к результатам. Вы можете увидеть этот побочный эффект, когда у вас нет повторяющейся строки.

Еще кое-что хотелось бы добавить -

Союз: - Набор результатов отсортирован по возрастанию.

Союз Все: - Набор результатов не отсортирован. Два вывода запроса просто добавляются.

Истинный ! UNION может изменить порядок двух подрезультатов.

theor 29.09.2015 00:49

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

a_horse_with_no_name 27.04.2016 09:12

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

spencer7593 13.10.2016 00:56

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

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

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

onedaywhen 05.12.2016 12:21

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.

onedaywhen 05.12.2016 11:49

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

onedaywhen 05.12.2016 12:19

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

вот связь к источнику. Есть хорошее описание.

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

onedaywhen 02.12.2016 12:17

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

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

SELECT * FROM Student
UNION
SELECT * FROM Teacher

результат будет

Когда вы применяете операцию UNION ALL к 2 таблицам, она возвращает все записи с дубликатами (если есть какое-либо различие между любым значением столбца строки в 2 таблицах). Так

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

Выход

Спектакль:

Очевидно, что производительность СОЮЗ ВСЕ лучше, чем СОЮЗ, поскольку они выполняют дополнительную задачу по удалению повторяющихся значений. Вы можете проверить это из Расчетное время выполнения, нажав ctrl + L в MSSQL

Действительно? За четырехрядный результат ?! Я бы подумал, что это сценарий, в котором вы захотите использовать UNION для передачи намерения (то есть без дубликатов), потому что UNION ALL вряд ли даст какой-либо реальный прирост производительности в абсолютном выражении.

onedaywhen 05.12.2016 12:18

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).

user743382 21.06.2016 20:30

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

DBA 21.06.2016 21:20

Технически вы МОЖЕТЕ получить результаты union, используя комбинацию join и некоторых действительно неприятных case, но это делает запрос почти невозможным для чтения и поддержки, и, по моему опыту, это также ужасно для производительности. Сравните: 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

Devin Lamothe 18.10.2016 01:22

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

Frank Schmitt 22.06.2017 10:15

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

СОЮЗ, он сливается с отдельным -> медленнее, потому что требует сравнения (в Oracle SQL Developer выберите запрос, нажмите 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;

Важный! Разница между 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!

Это не правильно. x union y - это select distinct * from (x union all y). select 1 from dual union select 1 from dual и (select 1 from dual union all select 1 from dual) union select 1 from dual возвращают 1 строку. PS Я не знаю, подразумеваете ли вы под t1 и t2 T1 и T1, но важно то, что указано в select. PS Для примера UNION (отдельный) вы не можете четко сказать, с точки зрения дубликатов, что вводится и для каждой СУБД, что она возвращает или почему. Используйте достаточно слов, предложений и ссылок на части примеров, чтобы было понятно.

philipxy 24.02.2021 16:59

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

Другие вопросы по теме