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');| nombre | puesto | salario |
|---|---|---|
| Natalia | Vendedora Senior | 38000.00 |
| Daniel | Vendedor | 32000.00 |
| Patricia | Vendedora | 32000.00 |
| Raúl | Vendedor Junior | 28000.00 |
| Cristina | Responsable de Almacén | 35000.00 |
| Marcos | Operario de Almacén | 26000.00 |
| Inés | Operaria de Almacén | 26000.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;| nombre | precio |
|---|---|
| 1984 | 12.99 |
| Cien años de soledad | 14.99 |
| El nombre del viento | 16.99 |
| Cable USB-C a Lightning | 19.99 |
| Banda elástica set x5 | 19.99 |
| Camiseta algodón básica | 24.99 |
| Camiseta técnica running | 34.99 |
| Cargador USB-C 65W | 35.99 |
| Clean Code | 39.99 |
| Sartén antiadherente 28cm | 39.99 |
| Xiaomi 14 | 599.99 |
| Sofá 3 plazas | 599.00 |
| Google Pixel 8 | 699.00 |
| Samsung Galaxy S24 | 899.99 |
| iPhone 15 Pro | 1299.99 |
| MacBook Air M3 | 1399.00 |
| Lenovo ThinkPad X1 | 1549.00 |
| ASUS ROG Zephyrus | 1899.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%';| nombre | puesto |
|---|---|
| Ricardo | Director General |
| Sofía | Directora de Ventas |
| Alberto | Director de Logística |
| Natalia | Vendedora Senior |
| Daniel | Vendedor |
| Patricia | Vendedora |
| Raúl | Vendedor 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;| nombre | apellidos | telefono |
|---|---|---|
| Andrés | Vega Romero | 623456780 |
| Carlos | Rodríguez Martín | 623456789 |
| Carmen | Ruiz Jiménez | 678901234 |
| David | Sánchez Moreno | 667890123 |
| Diego | Castro Iglesias | 601234568 |
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
);| nombre | apellidos |
|---|---|
| Diego | Castro... |
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
| A | NOT A |
|---|---|
| TRUE | FALSE |
| FALSE | TRUE |
| NULL | NULL |
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 > 50Si 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 <= 50Practica con NOT
Usa el editor para negar condiciones con NOT:
En el siguiente artículo veremos el operador IN, que simplifica las comparaciones contra listas de valores.
Escrito por Eduardo Lázaro
