В чем разница между UNION
и UNION ALL
?
В чем разница между UNION
и UNION ALL
?
Ответы:
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 в зависимости от объема сортируемых данных и настроек различных параметров СУБД (для 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
также удаляет дубликаты, которые возвращаются подзапросами, в то время как ваш подход не будет.
Просто добавьте мои два цента к обсуждению здесь: можно понять UNION
оператор как чистый, SET-ориентированный UNION - например, set A = {2,4,6,8}, set 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
.
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
потому что это огромная утечка производительности. Как правило, используйте, UNION ALL
если вы не уверены, какой использовать.
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
).
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 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
предложение.
Разница между Союзом против Союза ВСЕМ в 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
будет бросать
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» не удаляет повторяющиеся строки.