¿Cuáles son las 7 fases del diseño de bases de datos?

UNION en SQL: Combinando Resultados de Consultas

Valoración: 4.72 (7761 votos)

En el vasto universo de la gestión de bases de datos, la capacidad de combinar información de diversas fuentes es fundamental. Ya sea que necesites consolidar datos de ventas de diferentes regiones, agrupar listas de clientes de distintas tablas, o simplemente presentar un listado unificado de elementos dispersos, SQL ofrece herramientas poderosas para lograrlo. Una de estas herramientas esenciales es el operador UNION.

A primera vista, podría parecer que UNION es similar a un JOIN, pero su propósito y funcionamiento son radicalmente distintos. Mientras que un JOIN combina columnas de diferentes tablas basándose en una relación, UNION combina *filas* de los conjuntos de resultados de múltiples sentencias SELECT. Su objetivo es apilar los resultados de varias consultas en un único y coherente conjunto de datos.

Dominar el uso de UNION te permitirá crear reportes más completos y flexibles, integrar información de tablas con estructuras similares pero no necesariamente relacionadas por claves primarias/foráneas, y simplificar la lógica de tus consultas al evitar subconsultas o construcciones más complejas en algunos escenarios. Profundicemos en cómo funciona este operador y sus variantes.

Índice de Contenido

¿Qué es el Operador UNION en SQL?

El operador UNION se utiliza para combinar los conjuntos de resultados de dos o más sentencias SELECT en un único conjunto de resultados. La operación UNION elimina las filas duplicadas por defecto, presentando solo los registros únicos que existen en cualquiera de los conjuntos de resultados combinados.

Imagina que tienes dos tablas: una lista de empleados activos y otra lista de empleados retirados. Ambas tablas tienen columnas para Nombre, Apellido y Departamento. Si quisieras obtener una lista única de todas las personas (activas o retiradas) que han trabajado en la empresa, podrías usar UNION para combinar los resultados de una consulta sobre la tabla de empleados activos y otra sobre la tabla de empleados retirados.

La idea principal es simple: tomas el resultado de la primera consulta, le añades el resultado de la segunda consulta y, si usas UNION (sin ALL), filtras las filas que son exactamente iguales en ambos conjuntos para quedarte solo con una copia de cada una.

UNION vs. UNION ALL: La Diferencia Crucial

Aquí reside una de las distinciones más importantes al usar el operador UNION. Existen dos formas principales de emplearlo:

  • UNION: Como mencionamos, esta es la forma por defecto. Combina los conjuntos de resultados y elimina automáticamente las filas duplicadas. Si una fila idéntica aparece en ambas consultas (o varias veces dentro de los resultados combinados), solo se incluirá una vez en el resultado final. Este proceso de eliminación de duplicados requiere que la base de datos ordene y compare todas las filas, lo que puede tener un impacto en el rendimiento, especialmente con grandes volúmenes de datos.
  • UNION ALL: Esta variante combina los conjuntos de resultados y mantiene todas las filas, incluyendo los duplicados. Si una fila aparece en la primera consulta y también en la segunda, o si aparece varias veces en una sola consulta, todas esas apariciones se incluirán en el resultado final. UNION ALL es generalmente más rápido que UNION porque no necesita realizar el proceso de eliminación de duplicados. Debes usar UNION ALL cuando sabes que no habrá duplicados relevantes o cuando necesitas específicamente incluir todas las filas, incluso si son idénticas.

La elección entre UNION y UNION ALL depende de tus requisitos. Si necesitas una lista única de elementos, usa UNION. Si solo necesitas consolidar los datos y no te importa (o necesitas) ver los duplicados, usa UNION ALL para un mejor rendimiento.

UNION vs. JOIN: No Te Confundas

Es vital entender que UNION y JOIN resuelven problemas diferentes y funcionan de manera distinta. Esta es una fuente común de confusión para quienes se inician en SQL.

  • JOIN: Combina columnas de dos o más tablas horizontalmente basándose en una condición de relación entre ellas (por ejemplo, un ID de cliente que existe en ambas tablas). El resultado es una fila que contiene columnas de ambas tablas.
  • UNION: Combina filas de los conjuntos de resultados de dos o más sentencias SELECT verticalmente. El resultado es un conjunto de filas que provienen de cualquiera de las consultas originales, apiladas una encima de la otra.

Piensa en JOIN como "fusionar" información relacionada en la misma fila, y en UNION como "apilar" listas de elementos similares.

Una operación de JOIN compara las columnas de dos tablas para crear filas de resultados compuestas de columnas de las dos tablas. Una operación de UNION concatena conjuntos de resultados de dos consultas, pero no crea filas individuales de columnas obtenidas de dos tablas.

Reglas Fundamentales para Usar UNION

Para que una operación UNION sea válida, los conjuntos de resultados de las sentencias SELECT que se combinan deben cumplir ciertas reglas:

  1. Número y Orden de Columnas: Cada sentencia SELECT dentro de la operación UNION debe tener el mismo número de columnas. Además, el orden de las columnas en cada SELECT es importante, ya que la primera columna del primer SELECT se combina con la primera columna del segundo SELECT, la segunda con la segunda, y así sucesivamente.
  2. Compatibilidad de Tipos de Datos: Las columnas correspondientes (es decir, la primera columna de cada SELECT, la segunda columna de cada SELECT, etc.) deben tener tipos de datos compatibles. SQL intentará realizar conversiones implícitas si es posible, siguiendo las reglas de prioridad de tipos de datos. Sin embargo, es una buena práctica asegurarse de que los tipos de datos sean lo más similares posible o realizar conversiones explícitas (CAST/CONVERT) para evitar resultados inesperados o errores. Las columnas con tipo de datos XML son una excepción, deben tener exactamente el mismo tipo (tipado con la misma colección de esquemas o sin tipo) para poder combinarse.
  3. Nombres de Columnas: Los nombres de las columnas en el conjunto de resultados final generalmente se toman de la primera sentencia SELECT. Si deseas asignar nombres específicos a las columnas resultantes, debes usar alias en la primera sentencia SELECT.

El incumplimiento de estas reglas generará un error y la consulta no se ejecutará.

Sintaxis y Ejemplos Prácticos

La sintaxis básica de UNION es sencilla:

SELECT columna1, columna2, ... FROM tabla1 WHERE condicion1UNION [ALL]SELECT columna1, columna2, ... FROM tabla2 WHERE condicion2[ORDER BY columna_resultado];

Puedes combinar más de dos sentencias SELECT encadenando operadores UNION o UNION ALL.

Ejemplo Simple de UNION

Supongamos que tienes dos tablas, ClientesNorte y ClientesSur, con la misma estructura (IDCliente, NombreCliente, Ciudad). Quieres una lista única de todas las ciudades donde tienes clientes.

SELECT Ciudad FROM ClientesNorteUNIONSELECT Ciudad FROM ClientesSur;

Este ejemplo devolverá una lista de ciudades, eliminando cualquier ciudad que aparezca en ambas tablas para mostrar cada ciudad solo una vez.

Ejemplo de UNION ALL

Si en el ejemplo anterior quisieras ver *todas* las ciudades, incluyendo las que se repiten (para saber, quizás, cuántos clientes tienes en total por ciudad sumando ambas tablas, aunque para eso un GROUP BY sería mejor, este ejemplo ilustra UNION ALL), usarías:

SELECT Ciudad FROM ClientesNorteUNION ALLSELECT Ciudad FROM ClientesSur;

Este devolverá una lista donde cada ciudad aparecerá tantas veces como figure en ClientesNorte más las veces que figure en ClientesSur.

Uso de ORDER BY con UNION

La cláusula ORDER BY se aplica al conjunto de resultados combinado completo, no a cada sentencia SELECT individual. Debe colocarse al final de la última sentencia SELECT. Puedes ordenar por el nombre de una columna del resultado (que se toma de la primera SELECT) o por el número posicional de la columna.

SELECT IDCliente, NombreCliente FROM ClientesNorteWHERE Ciudad = 'Madrid'UNIONSELECT IDCliente, NombreCliente FROM ClientesSurWHERE Ciudad = 'Madrid'ORDER BY NombreCliente; -- Ordena el resultado combinado por nombre.

Es incorrecto colocar ORDER BY dentro de cada SELECT cuando se usa UNION, a menos que se use dentro de una subconsulta o expresión de tabla común (CTE) que luego se combine.

-- ESTO ES INCORRECTO EN LA MAYORÍA DE LOS CASOSSELECT IDCliente, NombreCliente FROM ClientesNorteORDER BY NombreCliente -- No se permite aquí en una UNION 'simple'UNIONSELECT IDCliente, NombreCliente FROM ClientesSurORDER BY NombreCliente;

Uso de Paréntesis con Múltiples UNION

Cuando combinas más de dos conjuntos de resultados, puedes usar paréntesis para controlar el orden en que se evalúan las operaciones UNION. Esto es particularmente útil cuando mezclas UNION y UNION ALL, ya que la operación entre paréntesis se ejecuta primero.

Considera tres tablas: ListaA, ListaB, ListaC, cada una con una columna Valor y algunos valores duplicados entre ellas.

-- Ejemplo: UNION ALL entre A y B, luego UNION (elimina duplicados) con CSELECT Valor FROM ListaAUNION ALLSELECT Valor FROM ListaBUNIONSELECT Valor FROM ListaC;-- Ejemplo: UNION (elimina duplicados) entre B y C primero, luego UNION ALL con ASELECT Valor FROM ListaAUNION ALL( SELECT Valor FROM ListaB UNION SELECT Valor FROM ListaC);

En el primer caso, `ListaA` y `ListaB` se combinan con `UNION ALL` (manteniendo todos los duplicados entre A y B). Luego, este resultado intermedio se combina con `ListaC` usando `UNION`, eliminando los duplicados entre el resultado intermedio (A+B) y C, así como los duplicados internos del resultado intermedio.

En el segundo caso, `ListaB` y `ListaC` se combinan con `UNION` primero (eliminando duplicados entre B y C, y dentro de B y C). Luego, este resultado intermedio se combina con `ListaA` usando `UNION ALL`, manteniendo todos los duplicados entre A y el resultado intermedio (B+C sin duplicados).

El uso de paréntesis cambia el resultado final al alterar el orden de las operaciones y, por lo tanto, el momento en que se eliminan (o no) los duplicados.

Consideraciones Adicionales

  • Tipos de Datos Resultantes: Si las columnas correspondientes tienen tipos de datos compatibles pero diferentes (por ejemplo, un VARCHAR y un NVARCHAR), el tipo de datos del conjunto de resultados final se determinará basándose en las reglas de prioridad de tipos de datos de SQL Server. Esto puede afectar el almacenamiento y la comparación de los datos resultantes.
  • Columnas con NULL: Las filas que son idénticas en todas las columnas *excepto* en una columna que contiene NULL se consideran distintas por UNION. UNION solo elimina filas donde *todas* las columnas coincidentes son idénticas (incluyendo NULLs que coinciden).
  • Rendimiento: UNION ALL es generalmente más rápido que UNION porque evita el costoso proceso de ordenar y comparar filas para eliminar duplicados. Siempre que no necesites eliminar duplicados, opta por UNION ALL.
  • Aplicabilidad: El concepto de UNION es estándar en SQL, pero la sintaxis exacta y el comportamiento pueden variar ligeramente entre diferentes sistemas de gestión de bases de datos (DBMS) como SQL Server (que fue la base del texto proporcionado), MySQL, PostgreSQL, Oracle, etc. Sin embargo, las reglas fundamentales y la distinción entre UNION y UNION ALL son consistentes.

Preguntas Frecuentes sobre UNION en SQL

Aquí respondemos algunas dudas comunes sobre el uso de UNION:

¿Puedo combinar consultas que seleccionan diferentes columnas?

No directamente con UNION. Las consultas deben seleccionar el mismo número de columnas y en el mismo orden. Los nombres de las columnas no tienen que ser iguales en las consultas originales, pero el tipo y orden son cruciales.

¿Qué pasa si las columnas tienen nombres diferentes en las consultas originales?

El conjunto de resultados final tomará los nombres de las columnas de la primera sentencia SELECT. Si quieres otros nombres, debes usar alias en la primera SELECT.

¿Puedo usar WHERE o GROUP BY en cada sentencia SELECT antes de la UNION?

Sí, absolutamente. Puedes incluir cualquier cláusula (WHERE, GROUP BY, HAVING) en cada sentencia SELECT individual para filtrar o agrupar los datos *antes* de que se combinen con UNION/UNION ALL. La cláusula ORDER BY, sin embargo, solo se aplica al resultado final.

¿Es lo mismo UNION que FULL OUTER JOIN?

No, son completamente diferentes. FULL OUTER JOIN combina filas *horizontalmente* de dos tablas si hay una coincidencia en la condición de JOIN, o si no la hay, incluyendo las filas que no tienen coincidencia de cualquiera de las tablas, llenando con NULL donde no hay datos. UNION combina filas *verticalmente* de los conjuntos de resultados de dos o más SELECTs que tienen la misma estructura de columnas.

¿Cómo puedo ordenar el resultado final de una operación UNION?

Debes colocar la cláusula ORDER BY al final de la *última* sentencia SELECT en la operación UNION. Puedes ordenar por el nombre de una columna del resultado (tomado de la primera SELECT) o por el número posicional de la columna.

Conclusión

El operador UNION es una herramienta indispensable en SQL para combinar conjuntos de resultados de múltiples consultas. Su capacidad para consolidar datos de diversas fuentes en un único listado es extremadamente útil para reportes y análisis. Entender la diferencia entre UNION (elimina duplicados) y UNION ALL (mantiene duplicados), así como las reglas para su correcta aplicación (mismo número y orden de columnas, tipos de datos compatibles), te permitirá utilizarlo de manera efectiva y eficiente. Recuerda que es fundamentalmente diferente de un JOIN, que combina columnas, no filas. Dominar UNION ampliará significativamente tus capacidades de consulta en SQL.

Si quieres conocer otros artículos parecidos a UNION en SQL: Combinando Resultados de Consultas puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir