🙏 Realmente necesitamos su apoyo. Necesitamos financiamiento para continuar nuestra misión: publicar nuevas lecciones y mejorar la plataforma. Si puede, por favor apoye el proyecto con una donación. Ayude al proyecto ahora →
Código SQL copiado al portapapeles

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.

Operaciones con conjuntos de datos SQL UNION INTERSECT EXCEPT


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.

  • UNION elimina duplicados del resultado final.
  • UNION ALL mantiene 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.

  • UNION te ayuda a construir una lista de referencia a partir de varias fuentes.
  • UNION ALL es útil para combinar flujos de datos antes de una agregación posterior.
  • INTERSECT muestra superposiciones o filas coincidentes.
  • EXCEPT te 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

  • UNION combina resultados y elimina duplicados.
  • UNION ALL combina resultados sin eliminar duplicados.
  • INTERSECT conserva solo las filas comunes de dos conjuntos.
  • EXCEPT devuelve filas que existen en el primer conjunto pero no en el segundo.
  • Todas las operaciones de conjuntos requieren consultas SELECT compatibles con el mismo número de columnas.
  • ORDER BY para 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.