El operador UNION ALL en SQL permite combinar los resultados de dos o más consultas SELECT en un único conjunto de resultados.
A diferencia de UNION, no elimina los duplicados, sino que devuelve todas las filas de cada consulta, incluso si son idénticas.
👉 UNION ALL suele ser más rápido que UNION, ya que no necesita comprobar duplicados.
Sintaxis básica de UNION ALL
SELECT columna1, columna2, ...
FROM tabla1
UNION ALL
SELECT columna1, columna2, ...
FROM tabla2;
Reglas:
- Cada consulta debe devolver el mismo número de columnas.
- Los tipos de datos deben ser compatibles en las posiciones de columna.
- El orden de las columnas debe coincidir.
Ejemplo simple de UNION ALL
Tabla clientes_a:
| nombre | ciudad |
|---|---|
| Ana | Madrid |
| Luis | Sevilla |
Tabla clientes_b:
| nombre | ciudad |
|---|---|
| Ana | Madrid |
| Carla | Valencia |
Consulta:
SELECT nombre, ciudad FROM clientes_a
UNION ALL
SELECT nombre, ciudad FROM clientes_b;
Resultado:
| nombre | ciudad |
|---|---|
| Ana | Madrid |
| Luis | Sevilla |
| Ana | Madrid |
| Carla | Valencia |
👉 A diferencia de UNION, aquí Ana – Madrid aparece dos veces porque no se eliminan duplicados.
Diferencia entre UNION y UNION ALL
| Característica | UNION | UNION ALL |
|---|---|---|
| Duplicados | Eliminados automáticamente | Conservados |
| Rendimiento | Más lento (verifica duplicados) | Más rápido (no los verifica) |
| Uso típico | Listas únicas de resultados | Listas completas, sin filtrado |
| Ejemplo con 2 «Ana» | Devuelve 1 registro | Devuelve 2 registros |
Ejemplo con múltiples SELECT
Podemos combinar más de dos consultas:
SELECT nombre, ciudad FROM clientes_es
UNION ALL
SELECT nombre, ciudad FROM clientes_fr
UNION ALL
SELECT nombre, ciudad FROM clientes_it;
👉 Une clientes de tres países y conserva todas las filas, incluso si hay nombres repetidos.
Ejemplo práctico: consolidar ventas
Tabla ventas_online y ventas_tienda:
SELECT id, total, 'Online' AS canal
FROM ventas_online
UNION ALL
SELECT id, total, 'Tienda' AS canal
FROM ventas_tienda;
👉 Devuelve todas las ventas, diferenciadas por el canal, sin eliminar duplicados.
Ejemplo con ORDER BY
El ORDER BY debe ir al final del conjunto:
SELECT nombre, ciudad FROM clientes_a
UNION ALL
SELECT nombre, ciudad FROM clientes_b
ORDER BY nombre;
👉 Ordena el resultado combinado, no cada consulta por separado.
Ejemplo con valores calculados
SELECT 'España' AS pais, COUNT(*) AS total FROM clientes_es
UNION ALL
SELECT 'Francia', COUNT(*) FROM clientes_fr;
👉 Devuelve la cantidad de clientes por país, mostrando cada resultado como fila independiente.
Casos de uso de UNION ALL
- Consolidar datos de varias tablas sin preocuparse por duplicados.
- Combinar históricos con datos actuales en un mismo reporte.
- Exportaciones de datos donde se necesita todo tal cual está.
- Análisis de logs o auditorías que pueden contener eventos repetidos.
- Pruebas y depuración, cuando queremos verificar entradas repetidas.
Errores comunes con UNION ALL
- Número de columnas diferente
SELECT nombre, ciudad FROM clientes
UNION ALL
SELECT nombre FROM proveedores; -- ❌ Error
- Tipos de datos incompatibles
👉 No se puede combinarVARCHARconDATEdirectamente. - Confundir con JOIN
👉UNION ALLapila resultados verticalmente;JOINune tablas horizontalmente. - Esperar que elimine duplicados
👉 Para eso se debe usarUNION.
Buenas prácticas con UNION ALL
- Usarlo cuando no importa o se necesitan duplicados.
- Para mejor rendimiento en grandes volúmenes, preferir
UNION ALLen lugar deUNION. - Aplicar alias claros a columnas calculadas.
- Agregar
ORDER BYsolo al final, nunca dentro de cada SELECT. - Asegurar que las consultas tengan el mismo número y tipo de columnas.
- Recordar que, a diferencia de DISTINCT, UNION ALL no elimina duplicados.
- Se pueden aplicar condiciones en cada consulta con WHERE.
UNION ALL vs JOIN: ¿cuándo usar cada uno?
- UNION ALL → une resultados verticalmente.
- JOIN → une resultados horizontalmente (según condiciones).
Ejemplo:
- UNION ALL: “quiero una lista de clientes de España y Francia en una sola tabla”.
- JOIN: “quiero los clientes con sus pedidos”.
UNION ALL en distintos motores de base de datos
- MySQL / MariaDB → soporte completo, con buen rendimiento.
- PostgreSQL → soporte estándar, incluso con expresiones.
- SQL Server → soporta UNION ALL y UNION.
- Oracle → incluye UNION ALL, útil en reportes.
- SQLite → soporta UNION ALL de forma estándar.
👉 En todos los motores modernos funciona igual.
Preguntas frecuentes (FAQ)
1. ¿UNION ALL elimina duplicados?
No, mantiene todos los registros.
2. ¿Qué diferencia hay con UNION?
UNION elimina duplicados; UNION ALL no lo hace.
3. ¿Cuál es más rápido?
UNION ALL, porque no compara registros para buscar duplicados.
4. ¿Se puede usar ORDER BY en cada SELECT de un UNION ALL?
No, solo se permite un ORDER BY al final.
5. ¿Se pueden combinar más de dos SELECT con UNION ALL?
Sí, tantas como quieras, siempre respetando columnas y tipos.
Conclusión
El operador UNION ALL en SQL es ideal para:
- Combinar resultados de varias consultas de manera rápida.
- Mantener duplicados cuando son necesarios para el análisis.
- Evitar la sobrecarga de eliminar registros repetidos.
Es especialmente útil en reportes de negocio, consolidación de datos y pruebas.
Repasa diferencias con UNION en SELECT y FROM y visita el Glosario SQL completo.