Contenido de esta guía
Qué calcula EXCEPT
EXCEPT es un operador de conjuntos. Compara dos resultados y conserva las filas que aparecen en el primero pero no en el segundo. El orden de las consultas importa: invertirlas cambia la respuesta.
Por defecto elimina duplicados del resultado. Algunos motores también admiten EXCEPT ALL, que conserva la multiplicidad y descuenta las apariciones del segundo conjunto.
Requisitos de las dos consultas
Las consultas deben ser compatibles como conjuntos:
- devolver el mismo número de columnas;
- colocar en la misma posición datos con tipos compatibles;
- comparar conceptos equivalentes, aunque los nombres originales sean distintos.
primera_consulta
EXCEPT
segunda_consulta
ORDER BY columna;El ORDER BY final ordena el resultado completo. Los nombres de las columnas se toman normalmente de la primera consulta.
Ejemplo guiado: clientes sin pedidos
SELECT id
FROM clientes
EXCEPT
SELECT cliente_id
FROM pedidos
ORDER BY id;| id |
|---|
| 6 |
| 12 |
La primera consulta reúne todos los identificadores de clientes. La segunda reúne los identificadores presentes en pedidos. Al restar el segundo resultado, quedan los clientes 6 y 12.
EXCEPT compara filas completas. Si seleccionas dos columnas, ambas forman la unidad de comparación. No compara únicamente la primera.
Error frecuente
Usar columnas que representan cosas distintas
SELECT id FROM clientes
EXCEPT
SELECT id FROM pedidos;Ambas columnas se llaman id, pero una identifica clientes y la otra identifica pedidos. La comparación correcta usa pedidos.cliente_id.
Comprueba lo aprendido
Encuentra empleados sin personas a cargo
Devuelve los identificadores de todos los empleados excepto los identificadores que aparecen como responsable_id. Excluye los valores NULL y ordena el resultado.
WHERE responsable_id IS NOT NULL a la segunda consulta.Solución razonada
SELECT id
FROM empleados
EXCEPT
SELECT responsable_id
FROM empleados
WHERE responsable_id IS NOT NULL
ORDER BY id;| id |
|---|
| 3 |
| 5 |
| 6 |
| 7 |
| 9 |
| 10 |
La primera consulta aporta todo el personal. La segunda resta a quienes aparecen como responsables de otra fila; quedan las personas sin equipo a cargo.
Compatibilidad entre motores
PostgreSQL, SQL Server, SQLite y las versiones actuales de MySQL admiten EXCEPT. La documentación moderna de Oracle también lo reconoce como sinónimo de MINUS. El soporte de ALL, los tipos compatibles y las reglas de ordenación pueden variar; consulta la versión concreta de tu motor.
Qué debes recordar
- El primer resultado es el conjunto del que se restan filas.
- Las consultas deben devolver columnas compatibles.
EXCEPTelimina duplicados salvo que se use una varianteALLcompatible.- Compara el significado de las columnas, no solo sus nombres.