Aprende SQL · lección gratuita
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.
AND: ambas condiciones deben ser verdaderas. salario > 8000 AND departamento_id = 2.OR: basta con que una de las condiciones sea verdadera. pais = 'Perú' OR pais = 'Chile'.NOT: invierte una condición. NOT estado = 'Cancelado' equivale a estado <> 'Cancelado'.NOT se evalúa antes que AND, y AND antes que OR. Usa paréntesis para forzar el orden que necesitas.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 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
-- 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 mezclarANDyORsin 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.
| Operador | Qué hace | Ejemplo |
|---|---|---|
AND | Todas las condiciones verdaderas | a > 5 AND b = 'x' |
OR | Al menos una verdadera | pais='Perú' OR pais='Chile' |
NOT | Niega una condición | NOT estado = 'Cancelado' |
( ) | Fuerza el orden de evaluación | (a OR b) AND c |
| Precedencia | NOT → AND → OR | usa paréntesis ante la duda |
---
← Columnas calculadas, alias y DISTINCTRangos y listas: BETWEEN e IN →