Aprende leyendo en orden

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 compuestasAND (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.

Antes de los ejercicios, confirma las definiciones de columnas de la tabla staff y una muestra de los datos.

① Ejecuta PRAGMA table_info(staff); para comprobar nombres de columnas, tipos y claves primarias.

② Ejecuta SELECT * FROM staff LIMIT 5; para previsualizar las primeras 5 filas.

Editor SQL

Ejecutar una consulta para ver el resultado

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 ACondición BA AND BA OR B
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse

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.

Precedencia de los operadores lógicos
NOT(más alta)AND(media)OR(más baja)siguientesiguiente
NOT se evalúa primero, luego AND, y por último OR — ese es el orden de evaluación. Cuando los mezclas, los paréntesis te permiten hacer explícito el orden buscado para no tener que llevar la precedencia en la cabeza.
-- 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';

Imagina que una revisión de bonus necesita "staff con base en Tokyo y salary de al menos 5.000.000". (Una vez lo ejecutes correctamente, aparecerá la explicación.)

① De staff, saca las columnas name, city y salary.

② Filtra a las filas donde `city` sea `'Tokyo'` Y `salary` sea al menos 5.000.000.

③ Confirma que el resultado son 3 filas (David Sato 6.800.000 / Grace Suzuki 5.500.000 / Jack Tanaka 5.900.000).

Editor SQL

Ejecutar una consulta para ver el resultado

Imagina que una notificación tiene que llegar a "staff con base en la región de Kanto (Tokyo) o de Kansai (Osaka)".

① De staff, saca las columnas name y city.

② Filtra a las filas donde `city` sea `'Tokyo'` U `'Osaka'` (usa OR).

③ Confirma que el resultado son 6 filas (Alice Tokyo / Bob Osaka / David Tokyo / Frank Osaka / Grace Tokyo / Jack Tokyo).

Editor SQL

Ejecutar una consulta para ver el resultado

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.

Cómo cambian el resultado los paréntesis
Sin paréntesis(no coincide con la intención)Con paréntesis(coincide con la intención)city = 'Tokyo'OR city = 'Osaka'AND salary >= 5000000(city = 'Tokyo' OR city = 'Osaka')AND salary >= 5000000Se lee comoTokyo OR(Osaka AND bien pagado)Se evalúa como(Tokyo OR Osaka)AND bien pagadoResultado: 6 filas(incluye Alice Tokyo 4500k)Resultado: 5 filas(excluye Alice Tokyo 4500k)
Una consulta pensada como "bien pagados en Tokyo u Osaka". La posición de los paréntesis cambia el significado — y el resultado.

`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.

Imagina la necesidad de "staff de Tokyo u Osaka con salary de al menos 5.000.000". En una sola consola, compara el resultado con y sin paréntesis para ver cómo cambia.

① De staff, saca las columnas name, city y salary.

② Primero, escribe la forma con paréntesis, la intencionada ((city = 'Tokyo' OR city = 'Osaka') AND salary >= 5000000).

③ Después quita los paréntesis a propósito (city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000).

④ Confirma que la primera devuelve 5 filas y la segunda devuelve 6 filas (se añade Alice Tokyo 4.500.000) — el resultado cambia.

Editor SQL

Ejecutar una consulta para ver el resultado

Imagina la necesidad de "construir una lista de todo el staff salvo los que tienen base en Kyoto".

① De staff, saca las columnas name y city.

② Filtra a las filas donde `city` no sea `'Kyoto'` (usa NOT (condición)).

③ Confirma que el resultado son 8 filas (Carol e Iris quedan excluidas).

Editor SQL

Ejecutar una consulta para ver el resultado
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Cómo se interpreta la condición WHERE WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000?

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?