В чем разница между 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использования комбинации 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 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» не удаляет повторяющиеся строки.