¿Qué son UNION y UNION ALL en SQL?
En una aplicación real los datos pueden venir de varios puntos de venta: un local físico, una tienda web o una sucursal. Si cada origen tiene su propia tabla, no hace falta hacer una consulta separada para cada una y juntar el resultado a mano. Podés combinarlas desde SQL.
Por ejemplo, si VentasLocal y VentasWeb guardan las mismas columnas, esta consulta muestra todas las ventas en un único resultado:
SELECT
IdComprador,
IdVenta,
Total
FROM VentasLocal
UNION ALL
SELECT
IdComprador,
IdVenta,
Total
FROM VentasWeb;
El resultado tiene una sola tabla de salida, aunque los datos provengan de dos tablas diferentes.
Condiciones para poder usar UNION
Cada SELECT debe devolver:
- La misma cantidad de columnas.
- Tipos de datos compatibles en la misma posición.
- Las columnas en el mismo orden lógico.
No es obligatorio que las columnas tengan el mismo nombre en las tablas originales. Los nombres que verá el resultado final son los del primer SELECT.
Diferencia entre UNION y UNION ALL
| Operador | Qué devuelve | Cuándo usarlo |
|---|---|---|
UNION ALL | Todas las filas, incluso las repetidas | Cuando cada registro importa y querés conservarlo tal como viene de cada origen |
UNION | Una sola copia de cada fila completamente idéntica | Cuando necesitás eliminar duplicados del resultado final |
UNION compara todas las columnas seleccionadas, no solo una. Dos filas se eliminan como duplicadas únicamente si todos sus valores coinciden.
Como UNION ALL no tiene que buscar y descartar duplicados, suele ser la opción más directa cuando sabés que los registros deben conservarse. No lo elijas por costumbre: primero definí si los repetidos son datos válidos o un problema que querés evitar.
Ejercicio 1: combinar ventas sin eliminar repetidos
Imaginá que querés listar el identificador del comprador, la venta y el total de todos los canales. No importa si una venta de la web coincide en valores con una venta del local: querés ver cada fila.
SELECT
IdComprador,
IdVenta,
Total
FROM VentasLocal
UNION ALL
SELECT
IdComprador,
IdVenta,
Total
FROM VentasWeb;
La palabra ALL es la clave: conserva el 100 % de las filas que devuelven ambas consultas.
Ejercicio 2: identificar el origen, filtrar y ordenar
Ahora vamos a armar un reporte un poco más útil. Queremos mostrar solo las ventas pagadas mayores a 3000, indicar si vienen del local o de la web y ordenarlas de mayor a menor.
Como ninguna tabla tiene una columna Origen, podemos crearla en la consulta con un valor fijo y un alias:
SELECT
IdComprador,
IdVenta,
Total,
'LOCAL' AS Origen
FROM VentasLocal
WHERE Estado = 'PAGADA'
AND Total > 3000
UNION ALL
SELECT
IdComprador,
IdVenta,
Total,
'WEB' AS Origen
FROM VentasWeb
WHERE Estado = 'PAGADA'
AND Total > 3000
ORDER BY Total DESC;
El WHERE se aplica en cada tabla antes de unir los resultados. En cambio, el ORDER BY va una sola vez al final porque ordena el resultado completo.
¿Cuándo se usa en reportes reales?
Este patrón es común cuando una empresa guarda operaciones similares en tablas separadas: ventas por sucursal, pedidos de distintas plataformas, movimientos históricos y actuales o datos de varios sistemas.
La unión te permite preparar una vista consistente para un reporte sin obligar a quien lo consulta a revisar cada fuente por separado. Después podés combinar este resultado con otros recursos de SQL, como JOIN, CASE WHEN o subqueries, según lo que necesites analizar.
Resumen rápido
- Usá
UNION ALLpara unir resultados y conservar todas las filas. - Usá
UNIONpara eliminar solo las filas completamente idénticas. - Seleccioná explícitamente columnas compatibles y en el mismo orden.
- Filtrá cada
SELECTconWHEREy ordená el resultado final con un únicoORDER BY.
Con estos operadores ya podés unificar información de varios orígenes y preparar reportes más claros. El siguiente paso es practicar consultas que mezclen estas ideas con JOIN, CASE y subconsultas.