WHERE: filtrar filas
En resumen: WHERE conserva solo las filas que cumplen una condición construida con comparaciones y con AND, OR y NOT.
Problema
¿Qué se agotó?
Cada mañana la encargada quiere saber qué productos hay que pedir porque se agotaron. La tabla tiene 25 productos. Mañana tendrá 2500.
No necesita todas las filas. Necesita solo aquellas donde las existencias son 0.
La idea
WHERE
WHERE conserva solo las filas para las que la condición es verdadera:
La base recorre cada fila, comprueba stock = 0 y conserva las verdaderas. La condición puede usar cualquier columna, no solo las de SELECT.
Las comparaciones son: = igual, <> distinto, <, >, <=, >=. Los números se escriben con punto decimal:
El texto va entre comillas simples:
Más precisamente, para curiosos
SQLite también acepta city = "Plovdiv" con comillas dobles, pero solo por una vieja costumbre: si no hay ninguna columna con ese nombre, lo toma como texto. PostgreSQL dirá que no existe la columna «Plovdiv». Escribe el texto entre comillas simples y la consulta funcionará en todas partes.
Pruébalo
Los productos caros
Muestra el nombre y el precio de los productos que cuestan al menos 10 €.
Solución
SELECT name, price FROM products WHERE price >= 10;WHERE price >= 10. Seis productos, desde la tabla de cortar (11,40 €) hasta el juego de cuchillos (39 €). «Al menos 10» incluye el 10, así que es >= y no >.
La idea
AND, OR, NOT
Las condiciones se pueden combinar:
AND: las dos deben ser verdaderas.OR: al menos una es verdadera.NOT: da la vuelta a la condición.
Productos baratos hay de sobra (para una oferta «lleva tres»):
Míralo
La trampa del OR
Marketing quiere los clientes de Sofía o de Plovdiv que se registraron desde principios de 2026. Aquí va un primer intento. Ejecútalo y mira las fechas:
Con paréntesis, la condición dice exactamente lo que quieres:
Siempre que mezcles AND y OR, añade paréntesis, aunque no hagan falta. Quien lea la consulta después de ti no tendrá que preguntarse nada.
Pruébalo
Los pedidos en espera
Muestra el número, el cliente y el estado de los pedidos que son new o paid, pero todavía no enviados.
Solución
SELECT id, customer_id, status FROM orders WHERE status = 'new' OR status = 'paid';WHERE status = 'new' OR status = 'paid'. 23 pedidos: 11 nuevos y 12 pagados. Con AND en lugar de OR no sale nada, porque un pedido tiene un solo estado.
Ejercicio
Dos tareas
1. Todos los pedidos menos los cancelados (cancelled). Muestra el número y el estado. Pruébalo con NOT.
Los pedidos que no están cancelados:
Solución
SELECT id, status FROM orders WHERE NOT status = 'cancelled';WHERE NOT status = 'cancelled', o más corto, WHERE status <> 'cancelled'. 53 pedidos.
2. La tienda abre un almacén en la costa. ¿Qué clientes de Varna o de Burgas están con nosotros desde 2025? Muestra el nombre, la ciudad y la fecha de registro.
Clientes de Varna o de Burgas que se registraron antes de 2026:
Solución
SELECT name, city, joined_at FROM customers
WHERE (city = 'Varna' OR city = 'Burgas') AND joined_at < '2026-01-01';WHERE (city = 'Varna' OR city = 'Burgas') AND joined_at < '2026-01-01'. Las fechas son texto en la forma año-mes-día, así que < las compara bien. Sin los paréntesis saldría también Hristo, de Varna, que se registró en 2026.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: SELECT: elegir columnas
- Continúa en: IN, BETWEEN y LIKE · NULL: sin valor · ORDER BY, LIMIT y DISTINCT · Aritmética en una consulta
- Ejercicios sobre el tema: Leer datos