Conjuntos · diferencia

EXCEPT

Devuelve las filas del primer resultado que no están presentes en el segundo.

Lectura: 5–7 minEjemplo con datos realesCompatibilidad revisada
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.
Estructura
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

SQL
SELECT id
FROM clientes
EXCEPT
SELECT cliente_id
FROM pedidos
ORDER BY id;
Resultado comprobado con la base educativa
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

Consulta sin sentido
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

Intermedia · diferencia de conjuntos

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.

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.
  • EXCEPT elimina duplicados salvo que se use una variante ALL compatible.
  • Compara el significado de las columnas, no solo sus nombres.

Conceptos relacionados

Fuentes técnicas consultadas