WHERE en SQL: filtrar filas con AND, OR, IN, BETWEEN y LIKE
Actualizado el 29 de septiembre de 2026
WHERE filtra las filas de una consulta: solo se devuelven las que cumplen la condición. Es lo que convierte "todos los productos" en "los productos de audio con stock", y aparece en casi todas las consultas reales.
Todos los ejemplos usan esta tabla de productos de una tienda. Fíjate en que el escritorio no tiene stock registrado (NULL), que no es lo mismo que tener 0.
CREATE TABLE productos (
id INTEGER PRIMARY KEY,
nombre TEXT,
categoria TEXT,
precio INTEGER,
stock INTEGER
);| id | nombre | categoria | precio | stock |
|---|---|---|---|---|
| 1 | Teclado | Computación | 25990 | 12 |
| 2 | Mouse | Computación | 12990 | 30 |
| 3 | Monitor | Computación | 159990 | 4 |
| 4 | Audífonos | Audio | 34990 | 0 |
| 5 | Parlante | Audio | 49990 | 7 |
| 6 | Silla | Muebles | 89990 | 3 |
| 7 | Escritorio | Muebles | 129990 | NULL |
Comparaciones
SELECT nombre, precio
FROM productos
WHERE precio < 30000;| nombre | precio |
|---|---|
| Teclado | 25990 |
| Mouse | 12990 |
Los operadores son =, <> (distinto; muchas bases también aceptan !=), <, >, <= y >=. En SQL la igualdad se escribe con un solo =, y los textos van entre comillas simples: WHERE categoria = 'Audio'.
Combinar condiciones: AND, OR y NOT
SELECT nombre, precio, stock
FROM productos
WHERE categoria = 'Computación' AND stock >= 10;| nombre | precio | stock |
|---|---|---|
| Teclado | 25990 | 12 |
| Mouse | 12990 | 30 |
AND exige que se cumplan ambas condiciones; OR, al menos una; NOT invierte una condición. Cuando se mezclan AND y OR, usa paréntesis: AND se evalúa primero, y eso cambia el resultado (hay un ejemplo en los errores comunes).
IN y BETWEEN
SELECT nombre, categoria
FROM productos
WHERE categoria IN ('Audio', 'Muebles');| nombre | categoria |
|---|---|
| Audífonos | Audio |
| Parlante | Audio |
| Silla | Muebles |
| Escritorio | Muebles |
IN es una forma corta de varios OR sobre la misma columna. BETWEEN filtra un rango e incluye los extremos:
SELECT nombre, precio
FROM productos
WHERE precio BETWEEN 25990 AND 49990;| nombre | precio |
|---|---|
| Teclado | 25990 |
| Audífonos | 34990 |
| Parlante | 49990 |
Buscar texto con LIKE
LIKE compara un texto contra un patrón: % representa cualquier cantidad de caracteres (incluso ninguno) y _, exactamente uno.
SELECT nombre FROM productos WHERE nombre LIKE 'M%'; -- empieza con M
-- Mouse, Monitor
SELECT nombre FROM productos WHERE nombre LIKE '%o'; -- termina en o
-- Teclado, Escritorio
SELECT nombre FROM productos WHERE nombre LIKE '_ouse'; -- una letra y "ouse"
-- MouseEn SQLite, LIKE no distingue mayúsculas en letras sin tilde: 'm%' también encuentra "Mouse", pero 'á' y 'Á' se consideran distintas. En MySQL depende de la configuración de la tabla (por defecto tampoco las distingue). PostgreSQL sí las distingue, y ofrece ILIKE para buscar sin distinguirlas.
Valores nulos: IS NULL
SELECT nombre
FROM productos
WHERE stock IS NULL;
-- EscritorioNULL representa un dato desconocido, y no se puede comparar con =: se pregunta con IS NULL o IS NOT NULL. Ojo con los filtros de "distinto": WHERE stock <> 0 devuelve 5 productos, no 6, porque el escritorio (NULL) tampoco pasa esa condición.
Errores comunes
Comparar con = NULL
WHERE stock = NULL no da error, pero devuelve cero filas: comparar cualquier cosa con NULL da un resultado desconocido, que WHERE trata como falso. Siempre IS NULL.
Mezclar AND y OR sin paréntesis
-- Intención: productos de audio o muebles que cuesten menos de 40.000
SELECT nombre, categoria, precio
FROM productos
WHERE categoria = 'Audio' OR categoria = 'Muebles' AND precio < 40000;| nombre | categoria | precio |
|---|---|---|
| Audífonos | Audio | 34990 |
| Parlante | Audio | 49990 |
El parlante cuesta más de 40.000 y aparece igual. Como AND se evalúa antes, la base leyó "audio (a cualquier precio), o muebles de menos de 40.000". Con paréntesis queda la intención original:
WHERE (categoria = 'Audio' OR categoria = 'Muebles') AND precio < 40000;
-- AudífonosOlvidar que BETWEEN incluye los extremos
precio BETWEEN 25990 AND 49990 es lo mismo que precio >= 25990 AND precio <= 49990. Si necesitas excluir un extremo, escribe las dos comparaciones a mano. Con fechas es un error frecuente: BETWEEN '2026-01-01' AND '2026-01-31' puede dejar fuera el día 31 si la columna guarda también la hora.
Ejercicios resueltos
Intenta resolver cada ejercicio antes de abrir la solución: equivocarse y corregir es la parte que más enseña.
1.Productos de computación baratos
Escribe una consulta que muestre el nombre y el precio de los productos de la categoría Computación que cuestan menos de 30.000.
Ver soluciónOcultar solución
SELECT nombre, precio
FROM productos
WHERE categoria = 'Computación' AND precio < 30000;| nombre | precio |
|---|---|
| Teclado | 25990 |
| Mouse | 12990 |
Las dos condiciones deben cumplirse a la vez, así que van unidas con AND. El texto va entre comillas simples y debe coincidir exactamente, tilde incluida: 'Computacion' no encontraría nada.
2.Productos sin stock
Escribe una consulta que muestre el nombre y el stock de los productos sin stock disponible: los que tienen 0 y los que no tienen el dato registrado.
Ver soluciónOcultar solución
SELECT nombre, stock
FROM productos
WHERE stock = 0 OR stock IS NULL;| nombre | stock |
|---|---|
| Audífonos | 0 |
| Escritorio | NULL |
0 y NULL son cosas distintas y necesitan condiciones distintas. WHERE stock = 0 solo encontraría los audífonos. Decidir cómo tratar los NULL es parte de escribir una consulta correcta: aquí el enunciado dice que un dato faltante cuenta como sin stock.
3.Rango de precio fuera de una categoría
Escribe una consulta que muestre el nombre y el precio de los productos que no son de la categoría Muebles y cuestan entre 20.000 y 50.000, ambos incluidos.
Ver soluciónOcultar solución
SELECT nombre, precio
FROM productos
WHERE categoria <> 'Muebles'
AND precio BETWEEN 20000 AND 50000;| nombre | precio |
|---|---|
| Teclado | 25990 |
| Audífonos | 34990 |
| Parlante | 49990 |
<> excluye la categoría y BETWEEN define el rango, extremos incluidos como pide el enunciado. Escribir cada condición en su propia línea no cambia nada para la base de datos, pero hace la consulta mucho más fácil de leer y de modificar.