Contenido de esta guía
Qué conserva UNION ALL
UNION ALL devuelve cada fila producida por cada SELECT. Si una fila aparece dos veces, se muestran dos apariciones.
Esto es importante cuando la repetición tiene significado: movimientos, eventos, ventas o filas procedentes de fuentes que debes contabilizar por separado.
Las consultas deben encajar
Como con UNION, cada bloque necesita el mismo número de columnas y tipos compatibles en la misma posición. Puedes añadir una columna literal para indicar el origen:
SELECT nombre, 'clientes' AS origen
FROM clientes
UNION ALL
SELECT nombre, 'empleados' AS origen
FROM empleados;El alias final se toma normalmente del primer SELECT. Aplica ORDER BY al conjunto completo, después del último bloque.
Ejemplo guiado
Reunimos categorías de productos sin stock y de productos con precio superior a 200:
SELECT categoria AS etiqueta
FROM productos
WHERE stock = 0
UNION ALL
SELECT categoria AS etiqueta
FROM productos
WHERE precio > 200
ORDER BY etiqueta;| etiqueta |
|---|
| Audio |
| Ordenadores |
| Ordenadores |
| Pantallas |
«Ordenadores» aparece dos veces porque cumple ambas condiciones. UNION ALL conserva esa información en lugar de convertirla en una lista única.
Por qué puede ser la opción correcta
Eliminar duplicados requiere trabajo adicional. Cuando necesitas todas las filas o sabes que los bloques no pueden solaparse, UNION ALL expresa mejor la intención y suele evitar esa fase de deduplicación.
Elegirlo solo por rendimiento sería un error si el resultado correcto exige valores únicos. Primero decide la semántica; después mide.
Error frecuente
Confundir una repetición válida con un duplicado accidental
Dos filas iguales pueden representar dos eventos reales. También pueden revelar que un JOIN o un bloque está generando más filas de las previstas. Comprueba el origen antes de añadir DISTINCT o cambiar a UNION.
Comprueba lo aprendido
Conserva pedidos de dos estados
Devuelve id, estado y una columna literal grupo. Reúne pedidos pendientes con el grupo «por revisar» y cancelados con «cerrado», usando UNION ALL. Ordena por id.
AS grupo.ORDER BY id una sola vez al final.Solución razonada
SELECT id, estado, 'por revisar' AS grupo
FROM pedidos
WHERE estado = 'pendiente'
UNION ALL
SELECT id, estado, 'cerrado' AS grupo
FROM pedidos
WHERE estado = 'cancelado'
ORDER BY id;| id | estado | grupo |
|---|---|---|
| 102 | pendiente | por revisar |
| 103 | cancelado | cerrado |
| 105 | pendiente | por revisar |
| 108 | cancelado | cerrado |
| 109 | pendiente | por revisar |
| 111 | pendiente | por revisar |
| 114 | pendiente | por revisar |
| 116 | cancelado | cerrado |
| 118 | pendiente | por revisar |
Los conjuntos no se solapan por estado, pero UNION ALL sigue siendo adecuado porque quieres conservar cada pedido.
Compatibilidad entre motores
UNION ALL está ampliamente disponible. Las reglas sobre conversión de tipos, ordenación de expresiones y paréntesis pueden variar. Mantén los nombres, tipos y significados alineados entre bloques.
Qué debes recordar
- UNION ALL conserva todas las filas.
- Las repeticiones pueden ser información válida.
- Los SELECT deben devolver columnas compatibles.
- Usa UNION si el resultado debe ser único.
Conceptos relacionados
Documentación oficial utilizada
Estas referencias se usaron para comprobar la conservación de repeticiones y las reglas de los SELECT compuestos.