SQL UNION vs UNION ALL: Diferencias, ejemplos y rendimiento probado
La diferencia entre ellos es una palabra, pero elegir mal puede darte silenciosamente un total equivocado. Vea ambos con datos reales, conozca las reglas que comparten y lea lo que sucedió cuando los cronometramos en un millón de filas.
UNIONcombina resultados y elimina filas duplicadas.UNION ALLmantiene cada fila.- Los costos de deduplicación funcionan, por lo que
UNION ALLsuele ser más rápido de calcular. - Usar
UNIONantes deSUMpuede eliminar silenciosamente valores reales y dar una respuesta incorrecta. - El valor predeterminado es
UNION ALL, a menos que desee específicamente eliminar los duplicados.
Ambos operadores apilan los resultados de dos consultas una encima de la otra, por lo que SQL UNION vs UNION ALL podría parecer una elección menor. No lo es. Una palabra extra cambia tanto el resultado como el esfuerzo que tiene que trabajar la base de datos.
Ejecutamos todas las consultas aquí en SQLite 3.50 y los resultados y tiempos mostrados provienen de esas ejecuciones. El comportamiento básico es SQL estándar en las principales bases de datos. Los tiempos, sin embargo, variarán según su propia base de datos, datos y hardware, así que trate el nuestro como ejemplo.
La respuesta corta
UNION combina dos conjuntos de resultados y devuelve solo filas distintas. UNION ALL los combina y devuelve todo, incluidos los duplicados. Esa es toda la diferencia, y el resto de este artículo trata sobre por qué es importante.
UNION vs UNION TODOS lado a lado
| Aspecto | UNIÓN | UNIÓN TODOS |
|---|---|---|
| Filas duplicadas | Eliminado | mantenido |
| Trabajo extra | Debe encontrar duplicados | Ninguno |
| Velocidad habitual | mas lento | Más rápido |
| Filas devueltas | Igual o menos | todos ellos |
| ¿Seguro antes de SUM o COUNT? | A menudo no | si |
| Lo mejor para | Listas únicas | Fusionar datos, registros y totales |
Los datos de muestra
Imagine una tienda que mantiene los pedidos en línea y en la tienda en mesas separadas. Tenga en cuenta que Asha tiene dos pedidos idénticos en línea y un pedido idéntico en la tienda.
CREATE TABLE online_orders (customer TEXT, total INT);
CREATE TABLE store_orders (customer TEXT, total INT);
INSERT INTO online_orders VALUES ('Asha',100), ('Ben',200), ('Asha',100);
INSERT INTO store_orders VALUES ('Asha',100), ('Dev',300);
ver la diferencia
SELECT customer, total FROM online_orders
UNION
SELECT customer, total FROM store_orders;
-- Asha | 100
-- Ben | 200
-- Dev | 300
SELECT customer, total FROM online_orders
UNION ALL
SELECT customer, total FROM store_orders;
-- Asha | 100
-- Ben | 200
-- Asha | 100
-- Asha | 100
-- Dev | 300
Cinco filas de entrada se convirtieron en tres con UNION y las cinco quedaron con UNION ALL. Dos cosas a tener en cuenta:
UNIONeliminó duplicados de todo el resultado, incluidos los de la primera tabla. No se trata sólo de comparar entre tablas.- Una fila cuenta como duplicada solo cuando todas las columnas seleccionadas coinciden.
Cuando realmente desea una lista distinta, UNION es exactamente la correcta. Esto le brinda a cada cliente que compró a través de cualquiera de los canales:
SELECT customer FROM online_orders
UNION
SELECT customer FROM store_orders;
-- Asha
-- Ben
-- Dev
El error total equivocado
Ésta es la razón por la que la elección realmente importa. Supongamos que desea ingresos totales. Los pedidos anteriores suman 800. Vea lo que ofrece cada operador:
SELECT SUM(total) FROM (
SELECT total FROM online_orders
UNION
SELECT total FROM store_orders
);
-- 600
SELECT SUM(total) FROM (
SELECT total FROM online_orders
UNION ALL
SELECT total FROM store_orders
);
-- 800
La versión UNION tiene un error de 200. Debido a que seleccionamos solo la columna total, tres pedidos separados de 100 rupias parecían duplicados y se colapsaron en uno. No hay ningún mensaje de error y 600 parece un número perfectamente creíble. Este tipo de error silencioso puede permanecer en un informe financiero durante meses.
Consejo: Dos filas que parecen idénticas pueden ser dos eventos genuinos. Antes de utilizar UNION, pregunte si filas idénticas significan el mismo hecho registrado dos veces o dos hechos diferentes. Para ventas, pagos y entradas de registro, suele ser el segundo.
Reglas que ambos deben seguir.
Ambos operadores tienen los mismos requisitos:
- Cada
SELECTdebe devolver el mismo número de columnas. - Las columnas coinciden por posición, no por nombre, así que manténgalas en el mismo orden.
- Los tipos de datos en cada posición deben ser compatibles.
- Los nombres de las columnas de resultados provienen del primero
SELECT. ORDER BYva al final y se aplica a todo el resultado.
Romper la primera regla da lugar a un error. Aquí está el mensaje de SQLite:
SELECT customer, total FROM online_orders
UNION
SELECT customer FROM store_orders;
-- SELECTs to the left and right of UNION do not have
-- the same number of result columns
La segunda regla es más peligrosa porque puede fallar sin cometer un error. Si intercambia dos columnas del mismo tipo, como first_name y last_name, la consulta se ejecuta y los datos resultan incorrectos. SQLite también es relajado en cuanto a los tipos, mientras que las bases de datos como PostgreSQL son más estrictas y pueden requerir una definición explícita CAST.
Etiquetar la fuente
Un truco muy práctico es añadir una columna constante que muestre de dónde procede cada fila. Debido a que la etiqueta es diferente, las filas de tablas diferentes ya no se pueden tratar como duplicados entre sí.
SELECT customer, total, 'online' AS channel FROM online_orders
UNION ALL
SELECT customer, total, 'store' FROM store_orders
ORDER BY customer, channel;
-- Asha | 100 | online
-- Asha | 100 | online
-- Asha | 100 | store
-- Ben | 200 | online
-- Dev | 300 | store
Una vez que tus datos tengan una etiqueta, puedes agruparlos para reportar ventas por canal, usando GROUP BY. Si necesita combinar varios pasos, envuelva la unión en un CTE para que sea legible.
Rendimiento: lo que pasó en nuestra prueba
Para eliminar duplicados, la base de datos tiene que comparar filas, generalmente ordenándolas o aplicando hash. UNION ALL puede omitir este paso. Creamos dos tablas con 500.000 filas cada una, que contenían números aleatorios del 0 al 50.000, por lo que había muchos duplicados. Ejecutamos cada consulta varias veces y mantuvimos el mejor tiempo.
Primero, contamos los resultados, de modo que el tiempo dedicado a enviar filas a nuestro programa no afectó la comparación:
| Consulta, envuelta en COUNT(*) | Filas | mejor momento |
|---|---|---|
| UNIÓN | 50,001 | 261 ms |
| UNIÓN TODOS | 1,000,000 | Menos de 1 ms |
La enorme brecha se debe en parte a que SQLite puede calcular ese recuento sin leer cada fila, así que no lo lea como “miles de veces más rápido”. Sin embargo, muestra la idea central: UNION tenía que hacer un trabajo real y UNION ALL no.
Luego recuperamos todas las filas en Python y el resultado cambió:
| Consulta, recuperando todas las filas | Filas devueltas | mejor momento |
|---|---|---|
| UNIÓN | 50,001 | 277 ms |
| UNIÓN TODOS | 1,000,000 | 392 ms |
En este caso, UNION ALL tardó más porque entregó veinte veces más filas. La deduplicación no es lo que lo frenó. Manejar un millón de filas lo fue. Entonces, la regla honesta es que UNION ALL es más barato de calcular para la base de datos, pero el tamaño del resultado también importa. Muchos gráficos en línea reducen esto a “UNION ALL es siempre más rápido”, y nuestra prueba muestra por qué no es tan simple.
Tampoco elijas basándose únicamente en la velocidad. Elija primero al operador que dé la respuesta correcta y luego sintonice. Si una consulta es lenta, lea nuestra guía para optimización de consultas SQL.
Cuando usar cada
Utilice UNION ALL cuando:
- Está fusionando datos de tablas similares, como particiones mensuales.
- Calculará los totales o recuentos después.
- Sabes que las entradas no pueden superponerse.
- Los duplicados son significativos, como en los registros o registros de auditoría.
Utilice UNION cuando:
- Necesita una lista única, como cada dirección de correo electrónico en dos sistemas.
- Las fuentes superpuestas contienen el mismo hecho más de una vez.
Trate UNION ALL como predeterminado y utilice UNION deliberadamente. Agregar una cláusula WHERE a cada rama, para filtrar temprano, ayuda a ambos.
INTERSECTAR y EXCEPTAR
Dos operadores de conjuntos relacionados responden a preguntas diferentes. Ambos siguen las mismas reglas de columna:
SELECT customer FROM online_orders
INTERSECT
SELECT customer FROM store_orders;
-- Asha (bought in both channels)
SELECT customer FROM online_orders
EXCEPT
SELECT customer FROM store_orders;
-- Ben (online only)
Oracle ha utilizado tradicionalmente MINUS en lugar de EXCEPT, y el soporte para estos operadores varía un poco según la base de datos y la versión.
UNIÓN vs UNIRSE
A menudo se confunden, pero combinan datos en diferentes direcciones:
| Operación | Dirección | Resultado |
|---|---|---|
| UNIÓN | verticales | Agrega más filas |
| ÚNETE | Horizontales | Agrega más columnas |
Errores comunes
- Usar UNION por costumbre. Puede costarle velocidad o eliminar filas válidas.
- Seleccionar muy pocas columnas. Omitir un ID hace que las distintas filas parezcan idénticas.
- Orden de columnas no coincidente. Los valores pueden aparecer en la columna incorrecta sin ningún error.
- Añadiendo ORDER BY a cada rama. Ordenar una vez, al final.
- Usar UNION para parchear una unión incorrecta. Si aparecen duplicados debido a una unión, corrija la unión.
- Asumiendo el orden de los resultados. Sin
ORDER BY, el orden de las filas no está garantizado para ninguno de los operadores.
Conclusión
Haga una pregunta cada vez: ¿filas idénticas son el mismo hecho o son hechos separados? Si están separados o si es imposible superponerlos, utilice UNION ALL. Si necesita una lista única, utilice UNION. Para verificar sus propios informes, busque en su código UNION cerca de SUM o COUNT y confirme que esos totales realmente sean correctos.
Preguntas frecuentes
¿Cuál es la diferencia entre UNION y UNION ALL?
UNION combina dos conjuntos de resultados y elimina filas duplicadas. UNION ALL los combina y mantiene cada fila, incluidos los duplicados.
¿Cuál es más rápido, UNION o UNION ALL?
UNION ALL suele ser más barato de calcular porque no busca duplicados. Obtener un resultado mucho mayor aún puede llevar más tiempo en general, como demostró nuestra prueba.
¿UNION elimina duplicados dentro de una tabla?
Sí. Elimina duplicados en todo el resultado combinado, incluidas filas idénticas que provienen todas de la misma tabla.
¿Los nombres de las columnas tienen que coincidir en una UNIÓN?
No. Las columnas coinciden por posición y el resultado utiliza nombres del primer SELECT. El recuento de columnas debe coincidir y los tipos deben ser compatibles.
¿Puedo usar ORDER BY con UNION?
Sí, pero coloque un ORDER BY al final de la declaración. Ordena todo el resultado combinado en lugar de una sola rama.
sigue aprendiendo
¿Necesitas ayuda con pruebas, WordPress o SEO?
Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.
Más guías sobre testing, IA y desarrollo moderno
¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.
Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas
Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…
Leer artículo →DevOpsExplicación de las variables de entorno: archivos .env, secretos y configuración bien hechos
Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…
Leer artículo →Desarrollo de softwareExplicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429
La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …
Leer artículo →Automatización de pruebasBurlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan
Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…
Leer artículo →Pruebas de softwareExplicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%
Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…
Leer artículo →Bases de datos y SQLDELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno
DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…
Leer artículo →Bases de datos y SQLVistas SQL explicadas: cree, use y evite los errores, con ejemplos
Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…
Leer artículo →Desarrollo de softwareInterfaz TypeScript versus tipo: diferencias reales, probadas con el compilador
Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…
Leer artículo →Desarrollo de softwarePython *args y **kwargs explicados: funciones flexibles con ejemplos claros
Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…
Leer artículo →Desarrollo de softwareFunciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas
Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…
Leer artículo →Inteligencia artificial¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar
¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…
Leer artículo →DevOpsMonitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos
Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…
Leer artículo →DevOpsDocker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta
Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…
Leer artículo →Automatización de pruebasTDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una
TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …
Leer artículo →Pruebas de softwarePruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales
Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…
Leer artículo →Bases de datos y SQLValores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar
Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…
Leer artículo →Bases de datos y SQLDeclaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes
CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…
Leer artículo →Desarrollo de software¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico
¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…
Leer artículo →Desarrollo de softwareExplicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos
El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…
Leer artículo →Desarrollo de softwareExplicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales
Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…
Leer artículo →Inteligencia artificial¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla
¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…
Leer artículo →DevOpsImplementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir
Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…
Leer artículo →Automatización de pruebasPruebas inestables: qué las causa y cómo solucionarlas para siempre
Pruebas inestables explicadas con demostraciones que realizamos: las causas principales, cómo confirmar y diagnosticar una, correcciones adecuadas p…
Leer artículo →Pruebas de softwarePruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6
Explicación de las pruebas de carga frente a las pruebas de estrés: qué prueba cada una, pruebas de picos y de absorción, las métricas que importan,…
Leer artículo →Pruebas de softwareCaso de prueba frente a escenario de prueba: diferencias clave, ejemplos y cuándo utilizar cada uno
Caso de prueba versus escenario de prueba explicado: definiciones claras, una tabla en paralelo, una función de restablecimiento de contraseña tomad…
Leer artículo →Bases de datos y SQLOptimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos
Optimización de consultas SQL probada en un millón de filas: lea planes de ejecución, agregue los índices correctos, corrija filtros no sargables, u…
Leer artículo →Bases de datos y SQLSQL UNION vs UNION ALL: diferencias, ejemplos y rendimiento probado
SQL UNION vs UNION ALL explicado con consultas que ejecutamos: duplicados, las reglas que siguen ambos, un error de datos real, rendimiento medido, …
Leer artículo →Desarrollo de softwareTutorial de JavaScript Fetch API: GET, POST, manejo de errores y tiempos de espera
Un tutorial de JavaScript Fetch API probado en un servidor local: GET y POST, por qué 404 no arroja, un asistente reutilizable, cadenas de consulta,…
Leer artículo →Desarrollo de softwareManejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos
El manejo de archivos Python se explica con el código que ejecutamos: modos abiertos, lectura de archivos grandes, CSV, JSON, pathlib, archivos bina…
Leer artículo →Desarrollo de softwareClases y objetos de Python: tutorial de programación orientada a objetos con ejemplos reales
Clases y objetos de Python explicados con el código que ejecutamos: __init__, métodos, atributos de clase versus instancia, herencia, propiedades, m…
Leer artículo →Inteligencia artificial¿Qué es un modelo de lenguaje grande? Cómo funcionan los LLM, explicados sin exageraciones
¿Qué es un modelo de lenguaje grande? Los LLM explicados en lenguaje sencillo: tokens, incrustaciones, atención, entrenamiento, ventanas de temperat…
Leer artículo →DevOpsComandos de Linux para principiantes: la guía esencial de terminal con ejemplos
Comandos de Linux para principiantes, agrupados por tarea: navegación, archivos, visualización de registros, grep, canalizaciones, permisos, proceso…
Leer artículo →Automatización de pruebasSelenium vs Playwright: diferencias clave, comparación de códigos y cuál elegir
Comparación de Selenium vs Playwright: arquitectura, espera, soporte de navegador e idioma, depuración, la misma prueba en ambas herramientas, conse…
Leer artículo →Pruebas de softwarePartición de equivalencia: técnica de diseño de pruebas explicada con ejemplos resueltos
Explicación de la partición de equivalencia: cómo encontrar particiones válidas e inválidas, ejemplos prácticos para edades, contraseñas y cupones, …
Leer artículo →Pruebas de softwareSeveridad vs Prioridad en Pruebas de Software: Diferencias, Matriz y Ejemplos Reales
Explicación de gravedad versus prioridad en las pruebas de software: definiciones claras, una matriz de cuatro vías con ejemplos, escalas de niveles…
Leer artículo →Bases de datos y SQLTutorial de subconsultas SQL: tipos, subconsultas correlacionadas y EXISTENCIAS con ejemplos
Un tutorial de subconsultas SQL con consultas que ejecutamos: subconsultas escalares, IN, FROM y SELECT, subconsultas correlacionadas, EXISTS, la tr…
Leer artículo →Bases de datos y SQLTransacciones SQL y ACID explicados: COMMIT, ROLLBACK y niveles de aislamiento
Transacciones SQL y ACID explicadas con una transferencia bancaria que ejecutamos: COMMIT, ROLLBACK, puntos de guardado, bloqueos, niveles de aislam…
Leer artículo →Desarrollo de softwareGit merge vs rebase: diferencias, ejemplos y cuándo usar cada uno
Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.
Leer artículo →Desarrollo de softwareList comprehension en Python: sintaxis, ejemplos y cuándo evitarla
List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.
Leer artículo →