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?
UNION elimina duplicados; UNION ALL los conserva.
2. ¿Cómo se llama EXCEPT en Oracle?
Oracle usa MINUS para la diferencia de conjuntos.
3. ¿Por qué falla esta consulta?
SELECT first_name, salary FROM employees
UNION
SELECT department_name FROM departments;
Ambas consultas deben devolver la misma cantidad de columnas (los nombres pueden diferir).