Este artículo proporcionará una revisión y verificación profunda en el operador SQL Union, describiendo sus múltiples usos junto con ejemplos y explorando algunas preguntas comunes como las diferencias de utilización entre Union vs Union All.
Para abordar y analizar los requisitos de datos que se aplican en el mundo real, es posible que podríamos necesitar combinar conjuntos de resultados de múltiples fuentes de datos para poder hacer un análisis de datos o crear nuevos conjuntos de datos. Los conjuntos de datos pueden ser idénticos, pero hay posibilidades de que se haga referencia a tablas diferentes. ¿Hay alguna manera de combinar los datos en una sola consulta? ¿Son los operadores de set una opción viable? Comencemos y veamos cómo se pueden usar algunos de los operadores existentes para ayudarnos a abordar estos desafíos comunes.
En este artículo, revisaremos:
- Lo que es un conjunto de operadores
- Union vs Union All y cómo funcionan
- Analizar las reglas para usar Union vs Union All
- Sintaxis del operador SQL
- Cómo usar una cláusula simple de Unión SQL en la instrucción select
- Cómo usar SQL Union con las consultas que tienen la cláusula WHERE
- Cómo usar la cláusula SELECT INTO con Union
- Cómo usar SQL Union con las consultas que tienen una cláusula WHERE y orden por cláusula
- Cómo usar SQL Union y SQL Pivot
- Cómo usar SQL Union con GRUPO y cláusulas HAVING
Operadores
Un operador es un símbolo o una palabra clave que define una acción que se realiza en una o más expresiones en la instrucción Select.
Establecer operador
Veamos los detalles de los los operadores de conjuntos en SQL Server y cómo usarlos.
Hay cuatro operadores básicos de conjuntos en SQL Server:
- Union
- Union All
- EXCEPT
- INTERSECT
Unión
El operador de Unión combina los resultados de dos o más consultas dando lugar a la creación de un único conjunto de resultados que incluye todas las filas que pertenecen a todas las consultas en la Unión. En esta operación, combina dos consultas más y elimina los duplicados.
Por ejemplo, la tabla ‘A’ tiene 1,2 y 3 y la tabla ‘B’ tiene 3,4,5.
El equivalente SQL de los datos anteriores es proporcionado a continuación
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
( SELECT 1 ID UNION SELECT 2 UNION SELECT 3 ) UNION ( SELECT 3 UNION SELECT 4 UNION SELECT 5 ); |
En la salida de datos, puede ver una lista distinta de los registros de los dos conjuntos de resultados
Union Total (Union All)
Cuando miramos Unión vs Unión total, pese a que encontramos que los mismos son bastante similares, pero se puede observar entre ellos que tienen algunas diferencias importantes desde la perspectiva de los resultados de rendimiento.
El operador UNION combina los resultados de dos o más consultas en un único conjunto de resultados los mismos que incluyen todas las filas que pertenecen a todas las consultas en la Unión. En términos simples, combina los dos o más conjuntos de filas y mantiene los duplicados.
Por ejemplo, la tabla ‘A’ tiene 1,2 y 3 y la tabla ‘B’ tiene 3,4,5.
El equivalente SQL de los datos anteriores se proporciona a continuación
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
( SELECT 1 ID UNION SELECT 2 UNION SELECT 3 ) UNION ALL ( SELECT 3 UNION SELECT 4 UNION SELECT 5 ); |
En la salida, puede ver todas las filas que también incluyen registros repetidos.
INTERSECT
El operador intersect mantiene las filas que son comunes a todas las consultas.
Para el mismo conjunto de datos del ejemplo mencionado anteriormente, se puede observar que la salida del operador de intersección se proporciona a continuación
La representación SQL de las tablas anteriores.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
( SELECT 1 ID UNION SELECT 2 UNION SELECT 3 ) INTERSECT ( SELECT 3 UNION SELECT 4 UNION SELECT 5 ); |
La fila ‘3’ es común entre los dos conjuntos de resultados.
EXCEPT O EXCLUSIÓN
El operador EXCEPT enumera las filas en el primero que no están en el segundo.
Vale la pena mencionar Para el mismo conjunto de datos del ejemplo anteriormente indicado, la salida del operador Excepto se da a continuación
La representación SQL de las tablas anteriores con el operador EXCEPT se proporciona a continuación
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
( SELECT 1 [Non-Common from only A ] UNION SELECT 2 UNION SELECT 3 ) EXCEPT ( SELECT 3 B UNION SELECT 4 UNION SELECT 5 ); |
Enumere las filas no comunes del primer conjunto o grupo de datos.
Nota: Es muy fácil visualizar un operador de conjunto utilizando para tal fin un diagrama de Venn, donde cada una de las tablas está representada por formas que se cruzan. Las intersecciones de las formas, donde se superponen las tablas, son las filas donde se cumple una condición.
Sintaxis:
La sintaxis para los operadores UNION vs UNION ALL en SQL es la siguiente:
SELECT Column1, Column2, … ColumnN
FROM <table>
[WHERE conditions]
[GROUP BY Column(s]]
[HAVING condition(s)]
UNION
SELECT Column1, Column2, … ColumnN
FROM table
[WHERE condition(s)];
ORDER BY Column1,Column2…
Reglas::
Hay algunas reglas que se aplican a todos los operadores establecidos:
- Las expresiones en cada fila o el número de columnas que se definen en cada consulta deben tener el mismo orden
- Los conjuntos de filas de instrucciones SQL posteriores deben coincidir con el tipo de datos de la primera consulta
- Los paréntesis pueden construir otros operadores de conjuntos en la misma instrucción.
- Es posible tener una cláusula ORDER BY, pero esa debería ser la última instrucción del SQL
- Las cláusulas GROUP BY y HAVING se pueden aplicar a la consulta individual
Nota:
- Todos estos operadores Set eliminan duplicados, excepto el operador Union All
- Los nombres de las columnas de salida se refieren desde la primera consulta, es decir, cuando ejecutamos las instrucciones SELECT con cualquiera de los operadores Set y el conjunto de resultados de cada una de las consultas puede tener diferentes nombres de columna, por lo que el resultado de la instrucción SELECT hace referencia a los nombres de columna ejecutada en la primera consulta en dicha operación.
- Es importante mencionar que SQL JOIN se usa con mayor frecuencia para combinar columnas de varias tablas relacionadas, mientras que los operadores SET combinan filas de varias tablas.
- Cuando los tipos de expresión son iguales pero difieren en precisión, escala o longitud, el resultado que se obtiene y se determina se logra en base a las mismas reglas para combinar expresiones
Ejemplos:
Las siguientes consultas T-SQL se preparan y se ejecutan en la base de datos Adventureworks2014. La mima que usted puede descargar la muestra de AdventireWorks2014 base de datos aquí..
Cómo usar una simple cláusula de UNION en SQL en la instrucción select
En este ejemplo, el conjunto de resultados incluye un conjunto distinto de filas del primer conjunto y en el segundo conjunto. El siguiente ejemplo se basa en las reglas 1, 3 y 5.
123456789101112131415161718192021222324252627SELECT *FROM((SELECT 1 AUNIONSELECT 2UNIONSELECT 3)UNION(SELECT 3 BUNIONSELECT 4UNIONSELECT 5)UNION ALL(SELECT 8 cUNIONSELECT 9UNIONSELECT 1)) T;La salida es una combinación de operadores Union y Union All los mismos que usan paréntesis.
2. Cómo usar SQL Union con las consultas que tienen la cláusula WHERE
El siguiente ejemplo muestra el uso de Union en dos instrucciones SELECT con una cláusula WHERE y una cláusula ORDER BY.
El siguiente ejemplo se basa en las reglas 1,2 y 3.
12345678910SELECT P1.ProductModelID,P1.NameFROM Production.ProductModel P1WHERE ProductModelID IN(3, 4)UNIONSELECT P2.ProductModelID,P2.NameFROM Production.ProductModel P2WHERE P2.ProductModelID IN(3, 4)ORDER BY P1.Name;
Cómo usar la cláusula SELECT INTO con SQL Union
El siguiente ejemplo crea una nueva tabla dbo.dummy utilizando la cláusula INTO en la primera instrucción SELECT que contiene el conjunto de resultados finales de la Unión de las columnas ProductModel y el nombre de dos conjuntos de resultados diferentes. En este caso, se deriva de la misma tabla, pero en un caso y una situación del mundo real, esto también puede dar origen a que sean dos tablas diferentes. El siguiente ejemplo se basa en las reglas 1, 2 y 4.
12345678910111213141516DROP TABLE IF EXISTS dbo.dummy;SELECT P1.ProductModelID,P1.NameINTO dummyFROM Production.ProductModel P1WHERE ProductModelID IN(3, 4)UNIONSELECT P2.ProductModelID,P2.NameFROM Production.ProductModel P2WHERE P2.ProductModelID IN(3, 4)ORDER BY P1.Name;GOSELECT *FROM dbo.Dummy;
Cómo usar SQL Union con las consultas que tienen una cláusula WHERE y una cláusula ORDER BY
Esto solo es posible cuando utilizamos funciones TOP o funciones agregadas en cada instrucción select del operador Union. En este caso, se enumeran las 10 filas principales de cada conjunto de resultados y luego las mismas se combinan con las filas usando la cláusula Union para obtener un resultado final. También usted verá que el orden por cláusula se coloca en toda la instrucción select.
123456789101112131415161718192021SELECT a.ModelID,a.NameFROM(SELECT TOP 10 ProductModelID ModelID,NameFROM Production.ProductModelWHERE ProductModelID NOT IN(3, 4)ORDER BY Name DESC) aUNIONSELECT b.ProductModelID,b.NameFROM(SELECT TOP 10 ProductModelID,NameFROM Production.ProductModelWHERE ProductModelID IN(5, 6)ORDER BY Name DESC) b;
Cómo usar SQL Union y SQL Pivot
En el siguiente ejemplo, estamos tratando de combinar más de un conjunto de resultados. En una situación del mundo real, puede tener números financieros de varias regiones o departamentos y como las tablas pueden tener las mismas columnas y tipos de datos, pero usted desea colocarlos en un conjunto de filas y en un solo informe. En tal escenario, usaría la cláusula Union y es muy fácil combinar resultados y transformar los datos en un informe más significativo.
En este ejemplo, ProductModel se clasifica en Top10, Top100, Top 100 y transforma las filas como un conjunto de valores agregados en las columnas respectivas. El siguiente ejemplo se basa en la regla 2
123456789101112131415161718192021222324SELECT MAX(Top10) Top10,MAX(Top100) Top100,MAX(Top1000) Top100FROM(SELECT COUNT(*) Top10,0 Top100,0 Top1000FROM Production.ProductModelWHERE ProductModelID < 10UNIONSELECT 0,COUNT(*),0FROM Production.ProductModelWHERE ProductModelID > 11AND ProductModelID < 100UNIONSELECT 0,0,COUNT(*)FROM Production.ProductModelWHERE ProductModelID > 101) T;Los valores NULL son muy importantes con los Operadores de conjuntos y se tratan como de bases de datos de ciudadanos de segunda clase. Debido a que los NULL se consideran únicos y si dos filas tienen un NULL en la misma columna, entonces se considerarían idénticos, por lo que, en ese caso, en realidad está comparando un NULL con un NULL y obteniendo igualdad. En el siguiente ejemplo, verá el uso de valores NULL. En este caso, usted puede observar que se opera con la función de agregado, máx.
123456789101112131415161718192021222324SELECT MAX(Top10) Top10,MAX(Top100) Top100,MAX(Top1000) Top100FROM(SELECT COUNT(*) Top10,NULL Top100,NULL Top1000FROM Production.ProductModelWHERE ProductModelID < 10UNIONSELECT NULL,COUNT(*),NULLFROM Production.ProductModelWHERE ProductModelID > 11AND ProductModelID < 100UNIONSELECT NULL,NULL,COUNT(*)FROM Production.ProductModelWHERE ProductModelID > 101) T;
Cómo usar SQL Union con Instrucciones Group y Have
Los siguientes ejemplos usan el operador Unión para combinar el resultado de la tabla que tiene en su totalidad la cláusula condicional definida usando la cláusula Group by y Having clause.
El apellido se analiza especificando las condiciones en la cláusula have.
El siguiente ejemplo se basa en la regla 5.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SELECT pp.lastname, COUNT(*) repeatedtwice, 0 Repeatedthrice FROM Person.Person AS pp JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID GROUP BY pp.lastname HAVING COUNT(*) = 2 UNION SELECT pp.LastName, 0, COUNT(*) NtoZRange FROM Person.Person AS pp JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID GROUP BY pp.LastName HAVING COUNT(*) > 2; |
Podemos ver que los apellidos se derivan en dos columnas diferentes usando el operador Union
Eso es todo por ahora …
Resumen
Hasta ahora, en esta sección nosotros hemos enfocado y abordamos varias opciones y reglas disponibles para usar los operadores Set y entender cuándo usarlas. Al determinar ya sea si se usan Union vs Union All, se podrá observar que hay algunos puntos a considerar. Use Union All si sabe que los conjuntos de resultados de múltiples consultas no se superponen o también los mismos generan duplicados y adicionalmente recuerde que, si necesita usar paréntesis, puede hacerlo. También puede pivotar y transformar la salida.
Sin embargo, usted solo debe asegurarse de que sus tipos de datos coincidan y si necesita hacer un ORDER BY, hágalo al final después de que haya ejecutado todas esas consultas establecidas. Por naturaleza, cuando se trata de Union vs Union All, Union All es más rápido que Union; ya que los operadores de la Unión incurren en mayores gastos generales adicionales para eliminar duplicados.
Espero que ustedes hayan disfrutado este artículo sobre el operador SQL Union. No dude en hacer cualquier pregunta en los comentarios a continuación.
- Descripción general de la función SQL CAST y SQL CONVERT - December 6, 2019
- Revisión del operador relacional y descripción general dePivot y Unpivot estático y dinámico de SQL - November 6, 2019
- Revisión, ejemplos y uso de SQL Union - November 4, 2019