UNION

El operador UNION combina los resultados de dos o más sentencias SELECT en un único conjunto de resultados. Es útil cuando necesitas mezclar datos de diferentes tablas, combinar filtros que no se expresan fácilmente en una sola consulta, o construir informes que consolidan información de varias fuentes.

UNION elimina las filas duplicadas del resultado combinado. Si quieres mantener los duplicados, usas UNION ALL.

Sintaxis

SELECT columnas FROM tabla1
UNION [ALL]
SELECT columnas FROM tabla2
[ORDER BY columna]
[LIMIT n];

Cada SELECT debe devolver el mismo número de columnas. Los nombres de las columnas del resultado final se toman del primer SELECT. El ORDER BY y el LIMIT, si los hay, se aplican al resultado combinado.

UNION básico

Un directorio de contactos que mezcle clientes y empleados:

SELECT nombre, email, 'cliente' AS tipo
FROM clientes
 
UNION
 
SELECT nombre, email, 'empleado'
FROM empleados
 
ORDER BY tipo, nombre;
nombreemailtipo
Alejandroalejandro.serrano@email.comcliente
Anaana.martinez@email.comcliente
Andrésandres.vega@email.comcliente
Carloscarlos.rodriguez@email.comcliente
......cliente
Albertoalberto.prieto@tienda.comempleado
Cristinacristina.guerrero@tienda.comempleado
Danieldaniel.vargas@tienda.comempleado
......empleado

El resultado combina las 20 filas de clientes con las 10 de empleados. La columna tipo es una constante literal que añadimos para identificar el origen de cada fila. El ORDER BY ordena el resultado final (primero todos los clientes, luego los empleados, ambos grupos ordenados por nombre).

UNION ALL vs UNION

La diferencia entre UNION y UNION ALL es el tratamiento de duplicados:

-- Productos con etiqueta 'premium'
SELECT p.nombre, p.precio
FROM productos p
JOIN etiquetas_producto ep ON p.id = ep.producto_id
WHERE ep.etiqueta = 'premium'
 
UNION ALL
 
-- Productos con etiqueta 'más vendido'
SELECT p.nombre, p.precio
FROM productos p
JOIN etiquetas_producto ep ON p.id = ep.producto_id
WHERE ep.etiqueta = 'más vendido';
nombreprecio
iPhone 15 Pro1299.99
MacBook Air M31399.00
ASUS ROG Zephyrus1899.99
Sofá 3 plazas599.00
iPhone 15 Pro1299.99
Samsung Galaxy S24899.99
Xiaomi 14599.99
Camiseta algodón básica24.99
Robot de cocina249.99

Con UNION ALL, el iPhone 15 Pro aparece dos veces porque tiene ambas etiquetas. Si cambiamos UNION ALL por UNION:

-- Misma consulta pero con UNION (sin ALL)
SELECT p.nombre, p.precio
FROM productos p
JOIN etiquetas_producto ep ON p.id = ep.producto_id
WHERE ep.etiqueta = 'premium'
 
UNION
 
SELECT p.nombre, p.precio
FROM productos p
JOIN etiquetas_producto ep ON p.id = ep.producto_id
WHERE ep.etiqueta = 'más vendido';
nombreprecio
iPhone 15 Pro1299.99
MacBook Air M31399.00
ASUS ROG Zephyrus1899.99
Sofá 3 plazas599.00
Samsung Galaxy S24899.99
Xiaomi 14599.99
Camiseta algodón básica24.99
Robot de cocina249.99

Ahora son 8 filas: el iPhone solo aparece una vez. UNION compara todas las columnas de cada fila para determinar si es duplicada. Si todas las columnas coinciden, se elimina.

UNION ALL es más rápido que UNION porque no necesita comprobar duplicados. Usa UNION ALL cuando sepas que no habrá duplicados o cuando no te importe que los haya.

Reglas de compatibilidad

Para que un UNION funcione, las consultas deben cumplir una regla fundamental: todas deben devolver el mismo número de columnas. Si los tipos de datos no coinciden, MySQL intenta convertirlos automáticamente:

-- ERROR: diferente número de columnas
SELECT nombre, precio FROM productos
UNION
SELECT nombre FROM categorias;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

Los nombres de las columnas del resultado siempre vienen del primer SELECT. Si el primer SELECT tiene AS producto y el segundo AS categoria, la columna del resultado se llamará producto.

UNION con ORDER BY y LIMIT

El ORDER BY y el LIMIT se aplican al resultado combinado, no a las consultas individuales:

SELECT nombre, precio, 'caro' AS rango
FROM productos
WHERE precio > 1000
 
UNION ALL
 
SELECT nombre, precio, 'barato'
FROM productos
WHERE precio < 25
 
ORDER BY precio DESC
LIMIT 8;
nombrepreciorango
ASUS ROG Zephyrus1899.99caro
Lenovo ThinkPad X11549.00caro
MacBook Air M31399.00caro
iPhone 15 Pro1299.99caro
Camiseta algodón básica24.99barato
Cable USB-C a Lightning19.99barato
Banda elástica set x519.99barato
El nombre del viento16.99barato

Si necesitas ordenar o limitar una consulta individual antes del UNION, envuélvela en paréntesis:

(SELECT nombre, precio FROM productos WHERE precio > 1000 ORDER BY precio DESC LIMIT 2)
UNION ALL
(SELECT nombre, precio FROM productos WHERE precio < 20 ORDER BY precio ASC LIMIT 2);

UNION para informes consolidados

Un caso de uso habitual es construir informes que resumen datos de diferentes periodos:

SELECT 'Q4 2025' AS periodo, COUNT(*) AS pedidos, SUM(total) AS ingresos
FROM pedidos
WHERE fecha_pedido BETWEEN '2025-10-01' AND '2025-12-31'
 
UNION ALL
 
SELECT 'Q1 2026', COUNT(*), SUM(total)
FROM pedidos
WHERE fecha_pedido BETWEEN '2026-01-01' AND '2026-03-31';
periodopedidosingresos
Q4 20252211080.69
Q1 20263244.96

Cada SELECT calcula sus propias agregaciones y el UNION ALL combina los resultados en una tabla compacta. Esto es equivalente a usar GROUP BY con CASE, pero a veces resulta más legible, especialmente cuando los periodos requieren filtros complejos.

UNION de la misma tabla con distintos filtros

Otra aplicación práctica: combinar filas de la misma tabla que cumplen criterios diferentes, añadiendo una columna que identifique el criterio:

SELECT id, estado, total, 'tiene notas' AS motivo
FROM pedidos
WHERE notas IS NOT NULL
 
UNION
 
SELECT id, estado, total, 'cancelado'
FROM pedidos
WHERE estado = 'cancelado'
 
ORDER BY id;
idestadototalmotivo
2entregado899.99tiene notas
5entregado1899.99tiene notas
10procesando599.99tiene notas
16cancelado699.00cancelado
17cancelado49.99cancelado
25cancelado149.99cancelado

Los pedidos 16 y 25 cumplen ambos criterios (están cancelados y tienen notas), pero UNION los muestra una sola vez. El motivo que aparece depende de cuál de las dos consultas los encontró primero. Si necesitaras que aparecieran dos veces (una por cada motivo), usarías UNION ALL.

Cuándo usar UNION

Usa UNION cuando necesites combinar resultados de tablas diferentes con estructura similar, consolidar datos con distintos filtros en un solo resultado, o construir informes que agreguen datos por separado. Prefiere UNION ALL cuando los duplicados no sean un problema, ya que es más eficiente.

Practica con UNION

Usa el editor para combinar resultados de varias consultas:

Simulador SQL
Ctrl+Enter para ejecutar

En el siguiente artículo veremos INTERSECT, que devuelve solo las filas que aparecen en ambas consultas.

Escrito por Eduardo Lázaro