Saltar a contenido

4.3 UNION, INTERSECT y EXCEPT

Un JOIN añade columnas (pega filas de tablas distintas «en horizontal»). Las operaciones de conjuntos combinan los resultados de dos consultas «en vertical»: suman filas, buscan lo común o restan.

Operación Devuelve
UNION Las filas de una u otra consulta, sin repetidas
UNION ALL Las filas de una y otra, con repetidas
INTERSECT Solo las filas que están en las dos
EXCEPT Las filas de la primera que no están en la segunda

Condición: las dos consultas deben tener el mismo número de columnas, con tipos compatibles. Los nombres de las columnas del resultado son los de la primera consulta.

UNION y UNION ALL

Una lista única con todas las personas del instituto (profesores y alumnos), indicando qué son:

SELECT nombre, 'profesor' AS rol FROM profesores
UNION
SELECT nombre || ' ' || apellido, 'alumno' FROM alumnos
ORDER BY rol, nombre;

Resultado:

nombre rol
Ana Gil alumno
Dani Soto alumno
Elena Marín alumno
Irene Lara alumno
Iván Torres alumno
Lola Ortiz alumno
… …

18 filas (se muestran 6)

Un único ORDER BY al final ordena todo el resultado.

La diferencia entre UNION y UNION ALL está en los repetidos. Las ciudades de dos grupos de alumnos:

SELECT ciudad FROM alumnos WHERE id_grupo = 1
UNION
SELECT ciudad FROM alumnos WHERE id_grupo = 3
ORDER BY ciudad;

Resultado:

ciudad
Cádiz
Jerez
Málaga
Sevilla

4 filas

Con UNION ALL no se eliminan los repetidos, y es más rápido (no tiene que comparar filas), por eso se prefiere cuando sabes que no habrá repetidos o no te importan:

SELECT ciudad FROM alumnos WHERE id_grupo = 1
UNION ALL
SELECT ciudad FROM alumnos WHERE id_grupo = 3
ORDER BY ciudad;

Resultado:

ciudad
Cádiz
Cádiz
Cádiz
Cádiz
Jerez
Málaga
Sevilla
Sevilla

8 filas

INTERSECT: lo que tienen en común

Las ciudades en las que viven alumnos del grupo 1 y también del grupo 3:

SELECT ciudad FROM alumnos WHERE id_grupo = 1
INTERSECT
SELECT ciudad FROM alumnos WHERE id_grupo = 3;

Resultado:

ciudad
Cádiz

1 fila

EXCEPT: restar

Los alumnos que tienen notas pero nunca han suspendido en la primera convocatoria (todos los que tienen alguna nota, menos los que tienen alguna nota por debajo de 5 en la convocatoria 1):

SELECT id_alumno FROM notas
EXCEPT
SELECT id_alumno FROM notas WHERE convocatoria = 1 AND nota < 5
ORDER BY id_alumno;

Resultado:

id_alumno
2
3
6
8
11

5 filas

Disponibilidad según el motor

UNION y UNION ALL existen en todos los motores. INTERSECT y EXCEPT están en SQLite y PostgreSQL; en MySQL desde la versión 8.0.31; y en Oracle EXCEPT se llama MINUS. Muchas veces lo mismo se puede escribir con IN, NOT IN o EXISTS (unidad 5).

Errores frecuentes

Error Cómo evitarlo
Consultas con distinto número de columnas Deben coincidir en número y tipo
Un ORDER BY en cada consulta Solo uno, al final, para todo el resultado
Esperar los repetidos con UNION Usar UNION ALL si los quieres
Confundir UNION con JOIN UNION suma filas; JOIN añade columnas

Para practicar

Los ejercicios S4.10 a S4.12 de S4 · Ejercicios practican las operaciones de conjuntos y las uniones de varias tablas.