Pregunta 1¿Cómo se interpreta la condición WHERE WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000?
WHERE en profundidad ① — AND, OR, NOT para construir condiciones compuestas
El primer artículo de WHERE en profundidad. Cubre la tabla de verdad de AND / OR / NOT, la precedencia de operadores y cómo usar paréntesis para hacer explícito el orden de evaluación — todo ejecutándose sobre un dataset staff cargado desde CSV.
Datos que usaremos — la tabla staff
A partir de este artículo, vamos a dedicar tres artículos a profundizar en los patrones de filtrado de WHERE. El primero son los operadores lógicos para construir condiciones compuestas — AND (y) / OR (o) / NOT (no) — más la precedencia de operadores y los paréntesis que entran en juego cuando los mezclas.
El dataset es la tabla staff (10 filas) cargada desde CSV, con las columnas name / city / salary / birthday. Construiremos condiciones habituales del mundo real como "Tokyo y bien pagado", "Tokyo o Osaka" y "que no esté en Kyoto" usando cada operador.
AND, OR, NOT — construir condiciones con operadores lógicos
Los operadores lógicos combinan varias condiciones en un mismo WHERE. Hay tres.
- `AND`: TRUE solo cuando ambas condiciones son TRUE
- `OR`: TRUE cuando al menos una de las condiciones es TRUE
- `NOT`: niega la condición que le sigue (TRUE → FALSE / FALSE → TRUE)
La sintaxis es simplemente intercalar la palabra clave: WHERE cond1 AND cond2, WHERE cond1 OR cond2, WHERE NOT (cond). Puedes encadenar AND / OR tantas veces como necesites, y NOT va delante de una sola condición.
| Condición A | Condición B | A AND B | A OR B |
|---|---|---|---|
| True | True | True | True |
| True | False | False | True |
| False | True | False | True |
| False | False | False | False |
La regla básica es: AND es TRUE solo cuando ambas son TRUE; OR es TRUE cuando alguna de las dos lo es. El comportamiento cuando se mezcla NULL en una comparación se cubre dentro de dos artículos bajo lógica de tres valores, pero en este artículo nos quedamos en el mundo de 2 valores (TRUE / FALSE) y aprendemos a componer condiciones.
-- 1) AND: cumple ambas (Tokyo y bien pagado)
SELECT name, city, salary FROM staff
WHERE city = 'Tokyo' AND salary >= 5000000;
-- 2) OR: cumple alguna (Tokyo o Osaka)
SELECT name, city FROM staff
WHERE city = 'Tokyo' OR city = 'Osaka';
-- 3) NOT: niega la condición (cualquier sitio menos Kyoto)
SELECT name, city FROM staff
WHERE NOT (city = 'Kyoto');
-- NOT también puede escribirse con != o <>
SELECT name, city FROM staff
WHERE city != 'Kyoto';
Precedencia de operadores — AND se evalúa antes que OR
La única regla que necesitas conocer sin falta cuando mezclas AND y OR es que `AND` tiene mayor precedencia que `OR`. Escribir A OR B AND C se interpreta como `A OR (B AND C)` — no de izquierda a derecha en el orden de escritura.
Esto a menudo produce resultados que no coinciden con tu intención, así que cuando mezcles AND y OR, haz siempre explícito el orden de evaluación con paréntesis. Los paréntesis no solo cambian la semántica de SQL — también comunican tu intención al lector — así que aunque el significado sea el mismo con o sin ellos, es buena costumbre ponerlos.
`AND` se evalúa antes que `OR`
A OR B AND C se interpreta como `A OR (B AND C)`. AND tiene mayor precedencia que OR, así que no se lee de izquierda a derecha en el orden de escritura.
Ejemplo: WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000 significa `city = 'Tokyo' OR (city = 'Osaka' AND salary >= 5000000)`, así que todo el staff de Tokyo se mantiene independientemente del salary (Alice Tokyo 4.500.000 queda incluida). Si quieres decir "bien pagados entre Tokyo u Osaka", escribe siempre (city = 'Tokyo' OR city = 'Osaka') AND salary >= 5000000 y haz explícito el orden de evaluación con paréntesis.
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué forma devuelve el mismo resultado que WHERE NOT (city = 'Tokyo')?
Pregunta 3¿Qué forma de poner paréntesis equivale a WHERE A AND B OR C?