¿Cuál es la diferencia entre UNION y UNION ALL?

Respuestas:

1734

UNIONelimina registros duplicados (donde todas las columnas en los resultados son iguales), UNION ALLno lo hace.

Hay un impacto en el rendimiento cuando se usa en UNIONlugar de UNION ALL, ya que el servidor de la base de datos debe hacer un trabajo adicional para eliminar las filas duplicadas, pero generalmente no desea los duplicados (especialmente al desarrollar informes).

Ejemplo de UNION:

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar

Resultado:

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)

UNIÓN TODO ejemplo:

SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar

Resultado:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Robbie Averill
fuente
179
La implicación de esto es que la unión es mucho menos eficaz ya que debe escanear el resultado en busca de duplicados
Matthew Watson
19
UNION ALL será más eficaz, específicamente debido a la falta del tipo distinto. Mi práctica general es usar UNION ALL a menos que específicamente quiera duplicados.
Adam Caviness
66
Acabo de dar cuenta de que hay una gran cantidad de buenos comentarios / respuestas aquí, así que di vuelta en la bandera wiki y añadió una nota sobre el rendimiento ...
Jim Harte
250
UNION ALL puede ser más lento que UNION en casos del mundo real donde la red, como Internet, es un cuello de botella. El costo de transferir muchas filas duplicadas puede exceder el beneficio del tiempo de ejecución de la consulta. Esto debe analizarse caso por caso.
Charles Burns
23
@AdamCaviness Tu comentario no tiene mucho sentido.
kojow7
285

Tanto UNION como UNION ALL concatenan el resultado de dos SQL diferentes. Se diferencian en la forma en que manejan los duplicados.

  • UNION realiza una DISTINCT en el conjunto de resultados, eliminando las filas duplicadas.

  • UNION ALL no elimina duplicados y, por lo tanto, es más rápido que UNION.

Nota: Al usar estos comandos, todas las columnas seleccionadas deben ser del mismo tipo de datos.

Ejemplo: si tenemos dos tablas, 1) Empleado y 2) Cliente

  1. Datos de la tabla de empleados:

ingrese la descripción de la imagen aquí

  1. Datos de la tabla del cliente:

ingrese la descripción de la imagen aquí

  1. Ejemplo de UNION (elimina todos los registros duplicados):

ingrese la descripción de la imagen aquí

  1. Ejemplo de UNION ALL (solo concatena registros, no elimina duplicados, por lo que es más rápido que UNION):

ingrese la descripción de la imagen aquí

Bhaumik Patel
fuente
3
"todas las columnas seleccionadas deben ser del mismo tipo de datos"; en realidad, las cosas no son tan estrictas (¡no es algo bueno desde el punto de vista del modelo relacional!). El estándar SQL dice que su descriptor de columna respectivo debe ser el mismo, excepto en el nombre.
cuando el
47

UNIONelimina duplicados, mientras UNION ALLque no.

Para eliminar duplicados, el conjunto de resultados debe ordenarse, y esto puede tener un impacto en el rendimiento de UNION, dependiendo del volumen de datos que se ordenan y la configuración de varios parámetros RDBMS (para Oracle PGA_AGGREGATE_TARGETcon WORKAREA_SIZE_POLICY=AUTOo SORT_AREA_SIZEy SOR_AREA_RETAINED_SIZEsi WORKAREA_SIZE_POLICY=MANUAL).

Básicamente, la clasificación es más rápida si se puede llevar a cabo en la memoria, pero se aplica la misma advertencia sobre el volumen de datos.

Por supuesto, si necesita que los datos se devuelvan sin duplicados, debe usar UNION, dependiendo de la fuente de sus datos.

Hubiera comentado en la primera publicación para calificar el comentario "es mucho menos eficaz", pero no tengo suficiente reputación (puntos) para hacerlo.

mathewbutler
fuente
1
"Para eliminar duplicados, el conjunto de resultados debe estar ordenado": tal vez tenga en mente a un proveedor en particular, pero no hay etiquetas específicas del proveedor en la pregunta. Incluso si lo hubiera, ¿podría probar que los duplicados no se pueden eliminar sin ordenar?
cuando el
2
distinct "implícitamente" clasificará los resultados, porque eliminar duplicados es más rápido en un conjunto ordenado. Esto no significa que el conjunto de resultados devuelto esté realmente ordenado de esa manera, pero en la mayoría de los casos distintos (y por lo tanto, UNION) clasificarán internamente el conjunto de resultados.
DevilSuichiro
30

En ORACLE: UNION no admite los tipos de columna BLOB (o CLOB), UNION ALL sí.

Michiel Overeem
fuente
13

Puede evitar duplicados y aún ejecutar mucho más rápido que UNION DISTINCT (que en realidad es lo mismo que UNION) ejecutando una consulta como esta:

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

Note la AND a!=Xparte. Esto es mucho más rápido que UNION.

Ihor Vorotnov
fuente
44
Esto omitirá filas y, por lo tanto, no producirá el resultado esperado si a contiene valores NULL. Además, todavía no devuelve el mismo resultado que a UNION: UNIONtambién elimina los duplicados que devuelven las subconsultas, mientras que su enfoque no lo hará.
Frank Schmitt
@FrankSchmitt: gracias por esta respuesta; ¡Este bit sobre subconsultas es exactamente lo que quería saber!
Doradus
11

Solo para agregar mis dos centavos a la discusión aquí: uno podría entender al UNIONoperador como una UNIÓN pura, orientada al SET, por ejemplo, el conjunto A = {2,4,6,8}, el conjunto B = {1,2,3,4 }, UNIÓN B = {1,2,3,4,6,8}

Cuando se trata de conjuntos, no querrá que los números 2 y 4 aparezcan dos veces, ya que un elemento está o no en un conjunto.

Sin embargo, en el mundo de SQL, es posible que desee ver todos los elementos de los dos conjuntos juntos en una "bolsa" {2,4,6,8,1,2,3,4}. Y para este propósito, T-SQL ofrece al operador UNION ALL.

Peter Perháč
fuente
2
Nitpick: UNION ALLno es "ofrecido" por T-SQL. UNION ALLes parte del estándar ANSI SQL y no es específico de MS SQL Server.
Frank Schmitt
1
El comentario 'Nitpick' podría implicar que no puede usar "Union All" en TSQL, pero puede hacerlo. Por supuesto, el comentario no dice eso, pero alguien que lo lea puede inferirlo.
JosephDoggie
10

UNIÓN
El UNIONcomando se usa para seleccionar información relacionada de dos tablas, de forma muy similar al JOINcomando. Sin embargo, cuando se usa el UNIONcomando, todas las columnas seleccionadas deben ser del mismo tipo de datos. Con UNION, solo se seleccionan valores distintos.

UNION ALL
El UNION ALLcomando es igual al UNIONcomando, excepto queUNION ALL selecciona todos los valores.

La diferencia entre Uniony Union alles que Union allno eliminará las filas duplicadas, en su lugar, solo extrae todas las filas de todas las tablas que se ajustan a los detalles de su consulta y las combina en una tabla.

Una UNIONdeclaración efectivamente hace un SELECT DISTINCTen el conjunto de resultados. Si sabe que todos los registros devueltos son únicos de su sindicato, en su UNION ALLlugar, use resultados más rápidos.

DotNetGuy
fuente
8

No estoy seguro de que importe qué base de datos

UNION y UNION ALL debería funcionar en todos los servidores SQL.

Debe evitar las innecesarias UNION, ya que son una gran pérdida de rendimiento. Como regla general, use UNION ALLsi no está seguro de cuál usar.

Jakub Šturc
fuente
No hay una etiqueta de SQL Server en esta pregunta. Creo que la opción que devuelve duplicados solo porque normalmente funciona mejor es el consejo equivocado.
cuando el
1
@onedaywhen supongo que el OP utilizó la frase "Servidores SQL" como sinónimo de todos los RDBMS (por ejemplo, MySQL, PostGreSQL, Oracle, SQL Server). Sin embargo, la redacción es desafortunada (y, por supuesto, podría estar equivocado).
Frank Schmitt
@FrankSchmitt: ninguno de los productos que enumeró son realmente RDBMS :)
cuando el
1
@onedaywhen cuidado de elaborar? Al menos en.wikipedia.org/wiki/Relational_database_management_system parece estar de acuerdo conmigo: menciona explícitamente Microsoft SQL Server, Oracle Database y MySQL. ¿O eres quisquilloso con la diferencia entre Oracle y Oracle Database, por ejemplo?
Frank Schmitt
8

UNION: genera registros distintos ,

mientras que

UNION ALL: genera todos los registros, incluidos los duplicados.

Ambos son operadores de bloqueo y, por lo tanto, personalmente prefiero usar JOINS en lugar de operadores de bloqueo (UNION, INTERSECT, UNION ALL, etc.) en cualquier momento.

Para ilustrar por qué la operación de la Unión funciona mal en comparación con la comprobación de la Unión Todos en el siguiente ejemplo

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'

ingrese la descripción de la imagen aquí

A continuación se presentan los resultados de las operaciones UNION ALL y UNION.

ingrese la descripción de la imagen aquí

Una declaración UNION efectivamente hace una SELECCIÓN DISTINTA en el conjunto de resultados. Si sabe que todos los registros devueltos son únicos de su sindicato, use UNION ALL en su lugar, da resultados más rápidos.

El uso de UNION da como resultado operaciones de clasificación diferenciadas en el plan de ejecución. La prueba para probar esta declaración se muestra a continuación:

ingrese la descripción de la imagen aquí

DBA
fuente
3
Todo en esta respuesta ya se ha dicho, es demasiado confuso para ser útil (sugiriendo uniones sobre sindicatos cuando hacen cosas diferentes, dando "bloqueo" como una razón sin explicar qué quiere decir con eso o a qué servidores de bases de datos se aplica), o es muy engañoso (sus porcentajes en su captura de pantalla no son aplicables al uso real real de UNION/ UNION ALL).
Los operadores de bloqueo son operadores bien conocidos en TSQL. Todo lo que hacen los operadores de bloqueo se puede lograr con Joins pero no al revés. La operación de clasificación distinta se encierra en un círculo en la imagen para mostrar por qué la unión funciona mejor que la unión y también para mostrar exactamente dónde existe en el plan de ejecución. ¡Siéntase libre de agregar más datos a las tablas T1 y T2 para jugar con los porcentajes!
DBA
Usted puede técnicamente producir los resultados de una unionusando una combinación de joins y algunos muy desagradables cases, pero hace que la consulta maldito-casi imposible de leer y mantener, y en mi experiencia, es también terrible para el rendimiento. Comparar: en select foo.bar from foo union select fizz.buzz from fizzcontraselect 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
@DBA Su respuesta solo es relevante para los usuarios de MS SQL Server. El OP nunca mencionó el RDBMS que están usando; podrían estar usando MySQL, PostgreSQL, Oracle, SQLite, ...
Frank Schmitt
6

union se usa para seleccionar valores distintos de dos tablas, donde como union all se usa para seleccionar todos los valores, incluidos los duplicados de las tablas


fuente
6

Es bueno entenderlo con un diagrama de Venn.

Aquí está el enlace a la fuente. Hay una buena descripción.

ingrese la descripción de la imagen aquí

michael-mammut
fuente
55
Su segunda imagen sugiere que los dos son mutuamente excluyentes cuando no lo son. La imagen debería mostrar lo mismo que la primera pero con la 'intersección elipse' ()mostrada por segunda vez. En realidad, pensándolo bien, porque el union allresultado no es un conjunto, ¡no debes intentar dibujarlo usando un diagrama de Venn!
cuando el
5

(Del libro de Microsoft SQL Server en línea)

UNIÓN [TODOS]

Especifica que varios conjuntos de resultados se deben combinar y devolver como un único conjunto de resultados.

TODAS

Incorpora todas las filas en los resultados. Esto incluye duplicados. Si no se especifica, se eliminan las filas duplicadas.

UNIONtomará demasiado tiempo ya que DISTINCTse aplican filas duplicadas que se encuentran como similares en los resultados.

SELECT * FROM Table1
UNION
SELECT * FROM Table2

es equivalente a:

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

Un efecto secundario de aplicar DISTINCTsobre resultados es una operación de clasificación de resultados.

UNION ALLLos resultados se mostrarán como un orden arbitrario en los resultados. Pero los UNIONresultados se mostrarán tal como se ORDER BY 1, 2, 3, ..., n (n = column number of Tables)aplican a los resultados. Puede ver este efecto secundario cuando no tiene ninguna fila duplicada.

shA.t
fuente
5

Agrego un ejemplo,

UNION , se está fusionando con distinto -> más lento, porque necesita comparación (en el desarrollador de Oracle SQL, elija la consulta, presione F10 para ver el análisis de costos).

UNION ALL , se está fusionando sin distinción -> más rápido.

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

y

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
Do Nhu Vy
fuente
2

UNION combina el contenido de dos tablas estructuralmente compatibles en una sola tabla combinada.

  • Diferencia:

La diferencia entre UNIONy UNION ALLes que UNION willomite registros duplicados, mientras UNION ALLque incluirá registros duplicados.

UnionEl conjunto de resultados se ordena en orden ascendente, mientras que el UNION ALLconjunto de resultados no se ordena

UNIONrealiza un DISTINCTen su conjunto de resultados para eliminar cualquier fila duplicada. Mientras UNION ALLque no eliminará duplicados y, por lo tanto, es más rápido que UNION. *

Nota : El rendimiento de UNION ALLnormalmente será mejor que UNION, ya que UNIONrequiere que el servidor haga el trabajo adicional de eliminar cualquier duplicado. Por lo tanto, en los casos en que es seguro que no habrá duplicados, o donde tener duplicados no es un problema, UNION ALLse recomienda su uso por razones de rendimiento.

pedram
fuente
1
"El conjunto de resultados de la Unión se ordena en orden ascendente": a menos que haya un ORDER BY, los resultados ordenados no están garantizados. Tal vez tenga en mente un proveedor SQL en particular (incluso entonces, ¿en orden ascendente qué exactamente ...?), Pero esta pregunta no tiene etiquetas específicas de proveedor =.
cuando el
"combina el contenido de dos tablas estructuralmente compatibles" - Creo que has dicho esta parte muy bien :)
cuando el
2

Supongamos que tiene dos mesas Profesor y Alumno

Ambos tienen 4 columnas con diferentes nombres como este

Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))

ingrese la descripción de la imagen aquí

Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)

ingrese la descripción de la imagen aquí

Puede aplicar UNION o UNION ALL para esas dos tablas que tienen el mismo número de columnas. Pero tienen diferente nombre o tipo de datos.

Cuando aplica la UNIONoperación en 2 tablas, descuida todas las entradas duplicadas (el valor de todas las columnas de la fila en una tabla es el mismo de otra tabla). Me gusta esto

SELECT * FROM Student
UNION
SELECT * FROM Teacher

el resultado será

ingrese la descripción de la imagen aquí

Cuando aplica la UNION ALLoperación en 2 tablas, devuelve todas las entradas con duplicado (si hay alguna diferencia entre cualquier valor de columna de una fila en 2 tablas). Me gusta esto

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

Salida ingrese la descripción de la imagen aquí

Actuación:

Obviamente, UNION ALL es mejor que UNION, ya que realizan tareas adicionales para eliminar los valores duplicados. Puede verificar eso desde el Tiempo estimado de ejecución presionando ctrl + L en MSSQL

reza.cse08
fuente
De Verdad? ¿Por un resultado de cuatro filas? Creo que este es un escenario en el que desearía utilizar UNIONpara transmitir la intención (es decir, sin duplicados) porque UNION ALLes poco probable que brinde una ganancia de rendimiento en la vida real en términos absolutos.
cuando el
2

En palabras muy simples, la diferencia entre UNION y UNION ALL es que UNION omitirá registros duplicados, mientras que UNION ALL incluirá registros duplicados.

Shubham Pandey
fuente
1

Una cosa más que me gustaría agregar

Unión : - El conjunto de resultados se ordena en orden ascendente.

Union All : - El conjunto de resultados no está ordenado. dos resultados de la consulta solo se agregan.

Rahul Sawant
fuente
Cierto ! UNION podría cambiar el orden de los dos subresultados.
Gracchus
66
Esto está mal. Una UNIONvoluntad NO Ordenar el resultado en orden ascendente. Cualquier pedido que vea en un resultado sin usar order byes pura coincidencia. El DBMS es libre de usar cualquier estrategia que considere eficiente para eliminar los duplicados. Esto podría estar ordenando, pero también podría ser un algoritmo de hash o algo completamente diferente, y la estrategia cambiará con el número de filas. Una unionque aparece ordenada con 100 filas podría no estar con 100,000 filas
a_horse_with_no_name
2
Sin una cláusula ORDER BY en la consulta, el RDBMS es libre de devolver las filas en cualquier secuencia. La observación de que el conjunto de resultados de una operación UNION se devuelve "en orden ascendente" es solo un subproducto de una operación de "clasificación única" realizada por la base de datos. El comportamiento observado no está garantizado. Así que no confíes en ello. Si la especificación es devolver filas en un orden particular, entonces agregue una ORDER BYcláusula apropiada .
spencer7593
1

Diferencia entre Union Vs Union ALL en SQL

¿Qué es la unión en SQL?

El operador UNION se utiliza para combinar el conjunto de resultados de dos o más conjuntos de datos.

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

Union Vs Union All With Example

Sandeep TK
fuente
1

¡Importante! Diferencia entre Oracle y Mysql: Digamos que t1 t2 no tienen filas duplicadas entre ellas, pero tienen filas duplicadas individuales. Ejemplo: t1 tiene ventas de 2017 y t2 de 2018

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

En ORACLE UNION ALL recupera todas las filas de ambas tablas. Lo mismo ocurrirá en MySQL.

Sin embargo:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

En ORACLE , UNION recupera todas las filas de ambas tablas porque no hay valores duplicados entre t1 y t2. ¡Por otro lado, en MySQL el conjunto de resultados tendrá menos filas porque habrá filas duplicadas dentro de la tabla t1 y también dentro de la tabla t2!

Aris Mist
fuente
0

UNION elimina registros duplicados en cambio, UNION ALL no lo hace. Pero uno debe verificar la mayor parte de los datos que se procesarán y la columna y el tipo de datos deben ser los mismos.

dado que union utiliza internamente un comportamiento "distinto" para seleccionar las filas, por lo tanto, es más costoso en términos de tiempo y rendimiento. me gusta

select project_id from t_project
union
select project_id from t_project_contact  

esto me da registros 2020

por otra parte

select project_id from t_project
union all
select project_id from t_project_contact

me da más de 17402 filas

en perspectiva de precedencia ambos tienen la misma precedencia.

Pawan Kumar
fuente
0

Si no es así ORDER BY, a UNION ALLpuede recuperar las filas a medida que avanza, mientras que a UNIONlo haría esperar hasta el final de la consulta antes de darle todo el conjunto de resultados a la vez. Esto puede marcar la diferencia en una situación de tiempo de espera: a UNION ALLmantiene viva la conexión, por así decirlo.

Entonces, si tiene un problema de tiempo de espera y no hay clasificación, y los duplicados no son un problema, UNION ALLpuede ser bastante útil.

AjV Jsy
fuente
Pero su primer fragmento de resultados podría ser una fila duplicada muchas veces: ¿qué tan útil es eso?
cuando el
0

UNION y UNION ALL solían combinar dos o más resultados de consulta.

El comando UNION selecciona información distinta y relacionada de dos tablas que eliminará las filas duplicadas.

Por otro lado, el comando UNION ALL selecciona todos los valores de ambas tablas, que muestra todas las filas.

Sona
fuente
0

Como hábito, siempre use UNION ALL . Use solo UNION en casos especiales cuando necesite eliminar duplicados que pueden ser extremadamente desordenados y puede leer todo en los otros comentarios aquí.

Clark Vera
fuente
0

UNION ALLTambién funciona en más tipos de datos. Por ejemplo, cuando se intenta unir tipos de datos espaciales. Por ejemplo:

select a.SHAPE from tableA a
union
select b.SHAPE from tableB b

arrojará

The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.

Sin embargo union allno lo hará.

Dowlers
fuente
-1

La única diferencia es:

"UNION" elimina filas duplicadas.

"UNION ALL" no elimina filas duplicadas.

Manoj Patel
fuente
13
¿Cómo agrega esto algún valor en comparación con la respuesta aceptada?
Nick
@ Nick Es una respuesta más corta.
Mostafa Vatanpour
Más breve podría ser una ventaja si tuviera que leer una parte significativa de la respuesta aceptada para obtener estos datos. Pero en este caso, la respuesta aceptada contiene toda esta información en la primera oración, luego de lo cual continúa discutiendo las implicaciones de la diferencia en detalle.
dmckee --- ex-gatito moderador