queryLab · software_de_entrenamiento en espera
Nivel 2 · Intermedio · SQL · álgebra relacional

[SQL 09] Operadores de conjunto

UNION, UNION ALL, INTERSECT y EXCEPT (MINUS en Oracle).
0 / 6 retos resueltos 📘 Programa Unidad III · «Uso del operador SET (union, union all, intersect, minus)»
Al terminar esta práctica podrás…
  • Combinar resultados de dos consultas con UNION y UNION ALL.
  • Obtener lo común con INTERSECT y la diferencia con EXCEPT / MINUS.
  • Respetar las reglas: misma cantidad de columnas y tipos compatibles; un solo ORDER BY al final.
  • Construir informes con secciones etiquetadas y emular operaciones con JOIN / EXISTS.

Los operadores de conjunto combinan los resultados de dos consultas (no las tablas), como en la teoría de conjuntos del álgebra relacional:

  • UNION: todas las filas de ambas consultas, sin duplicados.
  • UNION ALL: todas las filas, con duplicados (más rápido: no elimina repetidos).
  • INTERSECT: solo las filas que están en ambas.
  • EXCEPT (MINUS en Oracle): las filas de la primera que no están en la segunda.

Reglas: ambas consultas deben devolver la misma cantidad de columnas, con tipos compatibles y en el mismo orden; los nombres de columna del resultado son los de la primera consulta; y el ORDER BY va una sola vez, al final.

Sintaxis
SELECT col1, col2 FROM tabla_a WHERE …
UNION | UNION ALL | INTERSECT | EXCEPT
SELECT col1, col2 FROM tabla_b WHERE …
ORDER BY 1;
UNION
A ∪ B sin duplicados.
UNION ALL
A + B con duplicados: útil para apilar secciones de un informe.
INTERSECT
A ∩ B: lo que aparece en ambas.
EXCEPT / MINUS
A − B: lo que está en A y no en B.
Columnas compatibles
Misma cantidad, mismo orden, tipos compatibles.
ORDER BY final
Ordena el resultado combinado; se puede usar el número de columna.
SQLite / PostgreSQL / SQL Server
UNION · INTERSECT · EXCEPT
Oracle
UNION · INTERSECT · MINUS
MySQL 8.0.31+
UNION · INTERSECT · EXCEPT (antes: emular con JOIN)

1 · Ejemplos guiados · ejecuta y modifica cada bloque

01UNION: ciudades de América y Europa
Cada consulta trae ciudades de una región; UNION las combina sin duplicados (Toronto aparece una vez aunque tenga dos ubicaciones).
sql-conjuntos.sql
Presiona «ejecutar» para ver el resultado.
02UNION vs UNION ALL
Con UNION ALL se conservan los repetidos: compara la cantidad de filas de ambas consultas.
sql-conjuntos.sql
Presiona «ejecutar» para ver el resultado.
03INTERSECT: cargos actuales que también fueron históricos
Los job_id que aparecen tanto en employees como en job_history.
sql-conjuntos.sql
Presiona «ejecutar» para ver el resultado.
04EXCEPT (MINUS): países sin ubicaciones
Todos los países menos los que tienen alguna ubicación registrada.
sql-conjuntos.sql
Presiona «ejecutar» para ver el resultado.
05Informe con secciones (UNION ALL)
Apilamos resúmenes distintos, etiquetando cada fila con una constante.
sql-conjuntos.sql
Presiona «ejecutar» para ver el resultado.
06Emular INTERSECT con EXISTS
Donde no existe INTERSECT (MySQL antiguo) se usa EXISTS: mismo resultado que el ejemplo 3.
sql-conjuntos.sql
Presiona «ejecutar» para ver el resultado.
07Emular EXCEPT con NOT EXISTS
Y la diferencia con NOT EXISTS: mismo resultado que el ejemplo 4.
sql-conjuntos.sql
Presiona «ejecutar» para ver el resultado.

⚠ Errores frecuentes

  • Distinta cantidad de columnas en cada consulta: error «SELECTs to the left and right of UNION do not have the same number of result columns».
  • Poner un ORDER BY en cada consulta: va una sola vez, al final del conjunto.
  • Usar UNION cuando quieres conservar repetidos (por ejemplo, para sumar después): usa UNION ALL.
  • Mezclar columnas de tipos distintos en la misma posición (un nombre con un salario): el resultado no tiene sentido.

2 · Retos con corrección automática

Escribe tu solución y pulsa comprobar (Ctrl + Enter). Tu consulta y la solución se ejecutan en bases limpias y se comparan los resultados: no importan los nombres de las columnas, sí los datos (y el orden, cuando el reto lo pide). Si te atascas, usa la pista o mira el resultado esperado.

3 · Preguntas tipo solemne

1. ¿Qué operador elimina las filas duplicadas al combinar dos consultas?
2. ¿Cómo se llama EXCEPT en Oracle?
3. ¿Por qué falla esta consulta?
SELECT first_name, salary FROM employees
UNION
SELECT department_name FROM departments;