NOT

El operador NOT niega una condición: convierte lo verdadero en falso y lo falso en verdadero. Es útil cuando es más natural expresar lo que no quieres que lo que sí quieres.

Sintaxis

SELECT columnas
FROM tabla
WHERE NOT condicion;

NOT se coloca delante de la condición que quieres negar. También puede combinarse con otros operadores como IN, BETWEEN, LIKE y IS NULL, produciendo NOT IN, NOT BETWEEN, NOT LIKE e IS NOT NULL.

NOT con comparaciones

Puedes negar cualquier comparación simple. Estos dos WHERE son equivalentes:

-- Sin NOT
SELECT nombre, estado, total
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id
WHERE estado != 'cancelado';
 
-- Con NOT
SELECT nombre, estado, total
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id
WHERE NOT estado = 'cancelado';

Ambos excluyen los pedidos cancelados. En este caso, != es más directo y legible. NOT brilla cuando la condición que niegas ya es compleja o cuando se combina con operadores especiales.

NOT IN

NOT IN excluye las filas cuyo valor esté en una lista:

SELECT nombre, puesto, salario
FROM empleados
WHERE puesto NOT IN ('Director General', 'Directora de Ventas', 'Director de Logística');
nombrepuestosalario
NataliaVendedora Senior38000.00
DanielVendedor32000.00
PatriciaVendedora32000.00
RaúlVendedor Junior28000.00
CristinaResponsable de Almacén35000.00
MarcosOperario de Almacén26000.00
InésOperaria de Almacén26000.00

Obtenemos todos los empleados que no son directivos. NOT IN es la negación de IN: incluye todo lo que IN excluiría, y excluye todo lo que IN incluiría.

NOT BETWEEN

NOT BETWEEN devuelve las filas cuyo valor está fuera del rango especificado:

SELECT nombre, precio
FROM productos
WHERE precio NOT BETWEEN 50 AND 500
ORDER BY precio;
nombreprecio
198412.99
Cien años de soledad14.99
El nombre del viento16.99
Cable USB-C a Lightning19.99
Banda elástica set x519.99
Camiseta algodón básica24.99
Camiseta técnica running34.99
Cargador USB-C 65W35.99
Clean Code39.99
Sartén antiadherente 28cm39.99
Xiaomi 14599.99
Sofá 3 plazas599.00
Google Pixel 8699.00
Samsung Galaxy S24899.99
iPhone 15 Pro1299.99
MacBook Air M31399.00
Lenovo ThinkPad X11549.00
ASUS ROG Zephyrus1899.99

Aparecen los productos que cuestan menos de 50 o más de 500. Los que están entre 50 y 500 (inclusive) se excluyen.

NOT LIKE

NOT LIKE devuelve las filas que no coinciden con un patrón:

SELECT nombre, puesto
FROM empleados
WHERE puesto NOT LIKE '%Almacén%';
nombrepuesto
RicardoDirector General
SofíaDirectora de Ventas
AlbertoDirector de Logística
NataliaVendedora Senior
DanielVendedor
PatriciaVendedora
RaúlVendedor Junior

Obtenemos todos los empleados cuyo puesto no contiene la palabra "Almacén", excluyendo a Cristina, Marcos e Inés.

IS NOT NULL

IS NOT NULL es la negación de IS NULL. Devuelve las filas donde la columna tiene un valor (no es nula):

SELECT nombre, apellidos, telefono
FROM clientes
WHERE telefono IS NOT NULL
ORDER BY nombre
LIMIT 5;
nombreapellidostelefono
AndrésVega Romero623456780
CarlosRodríguez Martín623456789
CarmenRuiz Jiménez678901234
DavidSánchez Moreno667890123
DiegoCastro Iglesias601234568

De los 20 clientes, 17 tienen teléfono registrado. Los 3 sin teléfono (Paula, Alejandro y Marta) se excluyen.

Es importante recordar que no puedes escribir WHERE telefono != NULL ni WHERE NOT telefono = NULL. La comparación con NULL usando = o != siempre devuelve NULL, no verdadero ni falso. La forma correcta es siempre IS NULL o IS NOT NULL.

NOT con EXISTS

NOT EXISTS es una forma de encontrar registros que no tienen correspondencia en otra tabla. Por ejemplo, clientes que no han hecho ningún pedido:

SELECT nombre, apellidos
FROM clientes c
WHERE NOT EXISTS (
    SELECT 1
    FROM pedidos p
    WHERE p.cliente_id = c.id
);
nombreapellidos
DiegoCastro...

La subconsulta busca pedidos para cada cliente. Si no encuentra ninguno, NOT EXISTS devuelve verdadero y el cliente aparece en el resultado. Veremos EXISTS y subconsultas en detalle en su propia sección.

Tabla de verdad de NOT

ANOT A
TRUEFALSE
FALSETRUE
NULLNULL

NOT NULL devuelve NULL, no TRUE. Esto es coherente con la lógica de tres valores: si no sabes si algo es verdadero o falso (NULL), negar esa incertidumbre sigue siendo incertidumbre.

Precedencia de NOT

NOT tiene mayor precedencia que AND y OR. Se evalúa primero:

-- NOT se aplica solo a la primera condición
WHERE NOT precio > 100 AND stock > 50
 
-- MySQL lo interpreta como:
WHERE (NOT precio > 100) AND stock > 50
 
-- Es decir: precio <= 100 Y stock > 50

Si quieres negar una condición compuesta, enciérrala en paréntesis:

-- Negar ambas condiciones como conjunto
WHERE NOT (precio > 100 AND stock > 50)
 
-- Equivale a: precio <= 100 OR stock <= 50

Practica con NOT

Usa el editor para negar condiciones con NOT:

Simulador SQL
Ctrl+Enter para ejecutar

En el siguiente artículo veremos el operador IN, que simplifica las comparaciones contra listas de valores.

Escrito por Eduardo Lázaro