UNION ALL en SQL: qué es, cómo funciona y ejemplos prácticos

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:

nombreciudad
AnaMadrid
LuisSevilla

Tabla clientes_b:

nombreciudad
AnaMadrid
CarlaValencia

Consulta:

SELECT nombre, ciudad FROM clientes_a
UNION ALL
SELECT nombre, ciudad FROM clientes_b;

Resultado:

nombreciudad
AnaMadrid
LuisSevilla
AnaMadrid
CarlaValencia

👉 A diferencia de UNION, aquí Ana – Madrid aparece dos veces porque no se eliminan duplicados.

Diferencia entre UNION y UNION ALL

CaracterísticaUNIONUNION ALL
DuplicadosEliminados automáticamenteConservados
RendimientoMás lento (verifica duplicados)Más rápido (no los verifica)
Uso típicoListas únicas de resultadosListas completas, sin filtrado
Ejemplo con 2 «Ana»Devuelve 1 registroDevuelve 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

  1. Consolidar datos de varias tablas sin preocuparse por duplicados.
  2. Combinar históricos con datos actuales en un mismo reporte.
  3. Exportaciones de datos donde se necesita todo tal cual está.
  4. Análisis de logs o auditorías que pueden contener eventos repetidos.
  5. Pruebas y depuración, cuando queremos verificar entradas repetidas.

Errores comunes con UNION ALL

  1. Número de columnas diferente
SELECT nombre, ciudad FROM clientes
UNION ALL
SELECT nombre FROM proveedores; -- ❌ Error
  1. Tipos de datos incompatibles
    👉 No se puede combinar VARCHAR con DATE directamente.
  2. Confundir con JOIN
    👉 UNION ALL apila resultados verticalmente; JOIN une tablas horizontalmente.
  3. Esperar que elimine duplicados
    👉 Para eso se debe usar UNION.

Buenas prácticas con UNION ALL

  • Usarlo cuando no importa o se necesitan duplicados.
  • Para mejor rendimiento en grandes volúmenes, preferir UNION ALL en lugar de UNION.
  • Aplicar alias claros a columnas calculadas.
  • Agregar ORDER BY solo 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.

Scroll al inicio