Lesión 5.10 · Tiempo de lectura: ~8 min
Esta lección introduce las operaciones con conjuntos de datos en SQL. Aprenderás a combinar resultados de varias consultas, encontrar filas comunes y excluir valores que no necesitas. Veremos UNION, UNION ALL, INTERSECT y EXCEPT con ejemplos de Sakila. Al final de la lección, podrás elegir el operador adecuado para diferentes escenarios analíticos.
Operaciones con Conjuntos de Datos
En las lecciones anteriores, aprendiste cómo unir tablas con JOIN y cómo el motor ejecuta esas uniones. Ahora pasamos a una idea diferente: a veces no quieres conectar filas por claves, sino que deseas combinar y comparar conjuntos de resultados completos.
Las operaciones con conjuntos de datos son útiles cuando deseas fusionar datos de varias consultas, encontrar la superposición entre audiencias o eliminar filas que ya aparecen en otra lista. En la práctica, esto se presenta a menudo en informes, controles de calidad de datos y preparación de listas finales.
Qué Son las Operaciones con Conjuntos de Datos
Las operaciones con conjuntos de datos no trabajan con filas de una tabla, sino con los resultados de dos o más consultas. En términos de SQL, cada SELECT devuelve un conjunto de filas, y operadores como UNION o INTERSECT combinan esos conjuntos de acuerdo con reglas específicas.
Los cuatro operadores más utilizados son:
UNION- combina resultados y elimina duplicados;UNION ALL- combina resultados y mantiene duplicados;INTERSECT- conserva solo las filas que aparecen en ambos conjuntos;EXCEPT- devuelve filas del primer conjunto que no existen en el segundo.
Importante: no todas las bases de datos soportan estos operadores de la misma manera. Cuando mueves consultas entre motores, siempre verifica la versión y la compatibilidad.
Reglas Generales
Para usar una operación de conjunto, ambas consultas SELECT deben devolver resultados compatibles.
Requisitos de Consulta
- el mismo número de columnas;
- tipos de datos compatibles en posiciones correspondientes;
- el mismo orden de columnas;
- el mismo significado de valores cuando sea posible.
Si necesitas ordenar el resultado final, escribe ORDER BY al final de toda la expresión.
SELECT column1, column2
FROM table_a
UNION
SELECT column1, column2
FROM table_b
ORDER BY column1;
UNION y UNION ALL
UNION y UNION ALL se ven similares, pero resuelven problemas diferentes.
UNIONelimina duplicados del resultado final.UNION ALLmantiene todas las filas, incluso si se repiten.
Ejemplo: una lista de ciudades para clientes y personal
Supongamos que queremos una lista única de ciudades donde viven los clientes y el personal de Sakila.
SELECT
ci.city
FROM customer AS c
JOIN address AS a ON c.address_id = a.address_id
JOIN city AS ci ON a.city_id = ci.city_id
UNION
SELECT
ci.city
FROM staff AS s
JOIN address AS a ON s.address_id = a.address_id
JOIN city AS ci ON a.city_id = ci.city_id
ORDER BY city;
Resultado: obtienes una lista única de ciudades sin duplicados, incluso si los clientes y el personal viven en la misma ciudad.
Si deseas mantener todas las fuentes, usa UNION ALL:
SELECT
ci.city
FROM customer AS c
JOIN address AS a ON c.address_id = a.address_id
JOIN city AS ci ON a.city_id = ci.city_id
UNION ALL
SELECT
ci.city
FROM staff AS s
JOIN address AS a ON s.address_id = a.address_id
JOIN city AS ci ON a.city_id = ci.city_id
ORDER BY city;
Nota: UNION ALL es útil cuando los duplicados tienen significado, por ejemplo, si planeas contar filas en la lista combinada más adelante.
Cuándo Elegir UNION ALL
UNION ALL suele ser más rápido que UNION porque la base de datos no pierde tiempo eliminando duplicados. Así que si no necesitas unicidad, UNION ALL suele ser la mejor opción.
INTERSECT
INTERSECT devuelve solo las filas que aparecen en ambos conjuntos de resultados. Es útil cuando necesitas la superposición entre dos listas.
Ejemplo: ciudades donde viven tanto clientes como personal
SELECT
ci.city
FROM customer AS c
JOIN address AS a ON c.address_id = a.address_id
JOIN city AS ci ON a.city_id = ci.city_id
INTERSECT
SELECT
ci.city
FROM staff AS s
JOIN address AS a ON s.address_id = a.address_id
JOIN city AS ci ON a.city_id = ci.city_id
ORDER BY city;
Resultado: solo ves las ciudades que aparecen entre clientes y personal.
Dónde Ayuda
INTERSECT es útil para encontrar el segmento compartido entre dos audiencias, comparar listas de diferentes sistemas o verificar si dos extractos se superponen.
EXCEPT
EXCEPT devuelve filas del primer conjunto que no existen en el segundo. Es el operador de diferencia de conjuntos.
Ejemplo: ciudades donde viven clientes pero no personal
SELECT
ci.city
FROM customer AS c
JOIN address AS a ON c.address_id = a.address_id
JOIN city AS ci ON a.city_id = ci.city_id
EXCEPT
SELECT
ci.city
FROM staff AS s
JOIN address AS a ON s.address_id = a.address_id
JOIN city AS ci ON a.city_id = ci.city_id
ORDER BY city;
Resultado: obtienes la lista de ciudades donde hay clientes pero no personal.
Nota Importante
En algunas bases de datos, EXCEPT puede llamarse MINUS o puede estar disponible solo en ciertas versiones. Si escribes SQL portátil, deberías verificar eso por separado.
Uso Práctico
Las operaciones con conjuntos de datos son especialmente útiles en análisis y validación de datos.
UNIONte ayuda a construir una lista de referencia a partir de varias fuentes.UNION ALLes útil para combinar flujos de datos antes de una agregación posterior.INTERSECTmuestra superposiciones o filas coincidentes.EXCEPTte ayuda a encontrar desajustes, brechas y valores adicionales.
A veces, las operaciones con conjuntos de datos pueden ser reemplazadas por JOIN, pero eso no siempre es conveniente. Si necesitas comparar resultados de consultas en lugar de conectar tablas por claves, las operaciones con conjuntos de datos son a menudo más fáciles de leer.
Cuándo Es Mejor Reescribir Múltiples Condiciones OR con UNION
A veces, una larga cláusula WHERE con varias condiciones OR se vuelve difícil de leer y mantener. En ese caso, puedes dividir la lógica en ramas separadas y combinarlas con UNION.
Este enfoque es especialmente útil cuando:
- cada rama representa una regla de negocio diferente;
- las condiciones son muy diferentes en significado;
- deseas que la consulta sea más fácil de leer y mantener.
Ejemplo: encontrar películas que tengan una calificación R o que duren más de 180 minutos.
SELECT
title,
rating,
length
FROM film
WHERE rating = 'R'
UNION
SELECT
title,
rating,
length
FROM film
WHERE length > 180
ORDER BY title;
Resultado: en lugar de una larga cláusula WHERE ... OR ..., obtienes dos consultas claras que son más fáciles de leer, cambiar y probar. Si una fila puede coincidir con ambas ramas, UNION elimina duplicados automáticamente. Si los duplicados no son un problema y las ramas no se superponen, puedes usar UNION ALL.
Nota: si las condiciones se aplican a la misma columna, IN (...) suele ser suficiente. UNION es más útil cuando las ramas son lógicamente diferentes o dependen de diferentes columnas.
Preguntas para Entrevista
¿Cuál es la diferencia entre UNION y UNION ALL?
UNION combina los resultados de dos consultas y elimina duplicados, mientras que UNION ALL mantiene cada fila. En la práctica, UNION ALL suele ser más rápido porque no realiza el trabajo adicional de encontrar repeticiones.
¿Por qué las operaciones de conjuntos requieren consultas SELECT compatibles?
Porque SQL combina resultados por posición de columna, no por nombre de columna. Si dos consultas devuelven un número diferente de columnas o tipos de datos incompatibles, la base de datos no puede construir un conjunto final válido.
¿Cuándo deberías usar INTERSECT y cuándo deberías usar EXCEPT?
INTERSECT es mejor cuando necesitas las filas que aparecen en ambas listas. EXCEPT es útil cuando deseas restar la segunda lista de la primera y mantener solo los valores restantes.
¿Cómo son diferentes las operaciones de conjuntos de JOIN?
JOIN conecta filas por claves y generalmente agrega columnas de otra tabla. Las operaciones de conjuntos trabajan con resultados completos de consultas y los comparan como conjuntos, lo que es útil para combinar listas, encontrar superposiciones e identificar diferencias.
Conclusiones Clave de Esta Lección
UNIONcombina resultados y elimina duplicados.UNION ALLcombina resultados sin eliminar duplicados.INTERSECTconserva solo las filas comunes de dos conjuntos.EXCEPTdevuelve filas que existen en el primer conjunto pero no en el segundo.- Todas las operaciones de conjuntos requieren consultas
SELECTcompatibles con el mismo número de columnas. ORDER BYpara el resultado final debe ir al final de toda la expresión.- En análisis prácticos, estas operaciones son útiles para fusionar listas, encontrar superposiciones y comparar datos entre fuentes.
En la próxima lección, pasaremos a las subconsultas y veremos cómo usar declaraciones SELECT anidadas para condiciones y cálculos más flexibles.