Aprende SQL · lección gratuita

Lección 05 · Operadores lógicos: AND, OR, NOT

Resumen

Los operadores lógicos combinan varias condiciones dentro de un WHERE para construir filtros complejos. Trabajan sobre valores booleanos (verdadero/falso) y permiten exigir que se cumplan todas las condiciones, alguna de ellas, o negar una condición. Dominarlos es esencial porque casi toda consulta real filtra por más de un criterio.

Sintaxis / Conceptos

Precedencia de operadores (la trampa más común)

Cuando mezclas AND y OR sin paréntesis, SQL aplica primero todos los AND y luego los OR, como si AND fuera la "multiplicación" y OR la "suma". Estas dos consultas devuelven resultados distintos:

-- Sin paréntesis: se lee como  segmento='Enterprise' OR (pais='Perú' AND industria='Tecnología')
SELECT empresa, segmento, pais, industria FROM clientes
WHERE segmento = 'Enterprise' OR pais = 'Perú' AND industria = 'Tecnología';

-- Con paréntesis: cambia totalmente el significado
SELECT empresa, segmento, pais, industria FROM clientes
WHERE (segmento = 'Enterprise' OR pais = 'Perú') AND industria = 'Tecnología';

La primera devuelve todos los Enterprise más los peruanos de tecnología; la segunda solo empresas de tecnología que además sean Enterprise o peruanas. Ante la duda, escribe paréntesis siempre: hacen explícita la intención y evitan errores silenciosos.

NOT y las negaciones

NOT niega la condición que le sigue. NOT (a AND b) equivale a (NOT a) OR (NOT b) (leyes de De Morgan). En la práctica, para comparaciones simples es más legible usar el operador negado directo: <> en vez de NOT =, y más adelante NOT IN, NOT LIKE, NOT BETWEEN.

SELECT nombre, cargo, salario FROM empleados WHERE salario > 7000 AND departamento_id = 2

Ejemplos

-- AND: empleados de Ventas (departamento 2) con salario alto
SELECT nombre, cargo, salario FROM empleados
WHERE departamento_id = 2 AND salario > 8000
ORDER BY salario DESC;

-- OR: clientes Enterprise o ubicados en Chile
SELECT empresa, segmento, pais FROM clientes
WHERE segmento = 'Enterprise' OR pais = 'Chile'
ORDER BY empresa;

-- NOT: clientes que NO están en Perú
SELECT empresa, pais FROM clientes
WHERE NOT pais = 'Perú'
ORDER BY empresa;

-- Combinación con paréntesis: Enterprise de Perú o México
SELECT empresa, segmento, pais FROM clientes
WHERE segmento = 'Enterprise' AND (pais = 'Perú' OR pais = 'México')
ORDER BY empresa;

-- Tres condiciones encadenadas con AND
SELECT id, fecha, estado, canal FROM pedidos
WHERE estado = 'Completado' AND canal = 'Web' AND fecha >= '2024-01-01'
ORDER BY id;
💡 La causa #1 de "mi filtro trae filas de más" es mezclar AND y OR sin paréntesis. Si una consulta combina ambos, pon paréntesis aunque la precedencia ya te diera la razón: el código se vuelve auto-explicativo.

Cheatsheet

OperadorQué haceEjemplo
ANDTodas las condiciones verdaderasa > 5 AND b = 'x'
ORAl menos una verdaderapais='Perú' OR pais='Chile'
NOTNiega una condiciónNOT estado = 'Cancelado'
( )Fuerza el orden de evaluación(a OR b) AND c
PrecedenciaNOTANDORusa paréntesis ante la duda

---

← Columnas calculadas, alias y DISTINCTRangos y listas: BETWEEN e IN →

Ver todas las lecciones de Aprende SQL →