Sintaxis
SELECT...FROM...WHERE NOT(condición)Como uso el operador NOT?
Depende. Si la expresión condicional esta dada por operadores de comparación puedes encerrar dicha expresión en paréntesis y anteponer el operador NOT. Esto negará el resultado final de la condición. En el siguiente ejemplo queremos los clientes que no tengan código igual a 2.
SELECT *FROM CLIENTEWHERE NOT(ID=2)
Si usas operadores lógicos como ALL, ANY, EXISTS, etc, puedes anteponerlo a cada palabra y así negarás el resultado final. En la siguiente consulta queremos los clientes que tengan un código que no pertenezca al conjunto {22,25,26,40}.
SELECT *FROM CLIENTEWHERE EDAD NOT IN(22,25,26,40)
Aunque por preferencia y claridad siempre encierro el predicado en paréntesis sin importar que operador este usando, y luego antepongo el NOT. La siguiente consulta selecciona a los clientes que no tengan la máxima edad de la tabla.
SELECT *FROM CLIENTEWHERE NOT(EDAD>=ALL(SELECT EDAD FROM CLIENTE))
Cuando debo usar el operador NOT?
Cuando desees consultar todas las filas que hay en una tabla, excepto algunos registros. Este enfoque reduce el tamaño de la consulta y ahorra tiempo.
Considera la siguiente tabla CLIENTE:
Realicemos la siguiente consulta:
Busque todos los clientes que no tengan un código igual a 3,4 o 5 y además que no pasen de 30 años.
Veamos:
SELECT * FROM CLIENTEWHERE NOT(ID IN(3,4,5) AND EDAD>30)
Resultados de la consulta
Si observas bien, en el resultado solo falta un registro. Es es un cliente con código 4 y tiene 35 años. Esas características le hicieron cumplir las condiciones que establecimos para no incluirlo en el resultado final.
Que lógica utilice para construir la consulta?
Me enfoqué en las condiciones que no quiero que se cumplan. Luego las relacioné con un AND para que se lleven a cabo simultáneamente, y al final negué todo para salir bien librado.
Es como decirle al SGBD: "Amigo!, encuentra todo los registros que no me gustan...los encontraste?,perfecto!, despáchalos con mi NOT y déjame los que quiero...gracias mi hermano!". Hacer eso es muchísimo mejor que especificar uno a uno los registros que necesitamos en los resultados finales de la consulta.James Revelo Urrea - Desarrollador independiente