2.5.9. La diferencia

Para encontrar la diferencia entre dos o más sentencias SELECT FROM podemos utilizar la cláusula EXCEPT, que tiene este formato:

SELECT columnas FROM tabla [WHERE condiciones] EXCEPT [ALL] SELECT columnas FROM tabla [WHERE condiciones];

Si ponemos la opción ALL aparecerán todas las filas que da la diferencia. No la pondremos si queremos eliminar las filas repetidas.

Lo más importante de la diferencia es que somos nosotros quienes tenemos que vigilar que se haga entre columnas definidas sobre dominios compatibles.

Utilización de la diferencia en BDUOC

codigo_cli
40

Si queremos saber los clientes que no nos han contratado ningún proyecto, podríamos hacer:

SELECT codigo_cli FROM clientes EXCEPT SELECT codigo_cliente FROM proyectos;

El resultado de esta consulta sería el cliente con código 40.

La diferencia es, junto con la intersección, una de las operaciones del SQL que se puede realizar de más formas diferentes. También podríamos encontrar la diferencia utilizando NOT IN o NOT EXISTS:

a)  Diferencia utilizando NOT IN:

SELECT columnas FROM tabla WHERE columna NOT IN (SELECT columna FROM tabla [WHERE condiciones]);

b)  Diferencia utilizando NOT EXISTS:

SELECT columnas FROM tabla WHERE NOT EXISTS (SELECT * FROM tabla WHERE condiciones);

Ejemplo anterior expresado con NOT IN y con NOT EXISTS

El ejemplo que hemos hecho antes se podría expresar con NOT IN:

SELECT c.codigo_cli FROM clientes c WHERE c.codigo_cli NOT IN (SELECT p.codigo_cliente FROM proyectos p);

o también con NOT EXISTS

SELECT c.codigo_cli FROM clientes c WHERE NOT EXISTS (SELECT * FROM proyectos p WHERE c.codigo_cli = p.codigo_cliente);