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.

Estructura
CREATE TABLE productos (
  id        INTEGER PRIMARY KEY,
  nombre    TEXT,
  categoria TEXT,
  precio    INTEGER,
  stock     INTEGER
);
productos
idnombrecategoriapreciostock
1TecladoComputación2599012
2MouseComputación1299030
3MonitorComputación1599904
4AudífonosAudio349900
5ParlanteAudio499907
6SillaMuebles899903
7EscritorioMuebles129990NULL

Comparaciones

SELECT nombre, precio
FROM productos
WHERE precio < 30000;
nombreprecio
Teclado25990
Mouse12990

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;
nombrepreciostock
Teclado2599012
Mouse1299030

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');
nombrecategoria
AudífonosAudio
ParlanteAudio
SillaMuebles
EscritorioMuebles

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;
nombreprecio
Teclado25990
Audífonos34990
Parlante49990

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"
-- Mouse

En 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;
-- Escritorio

NULL 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;
nombrecategoriaprecio
AudífonosAudio34990
ParlanteAudio49990

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ífonos

Olvidar 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ón
Solución
SELECT nombre, precio
FROM productos
WHERE categoria = 'Computación' AND precio < 30000;
nombreprecio
Teclado25990
Mouse12990

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ón
Solución
SELECT nombre, stock
FROM productos
WHERE stock = 0 OR stock IS NULL;
nombrestock
Audífonos0
EscritorioNULL

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ón
Solución
SELECT nombre, precio
FROM productos
WHERE categoria <> 'Muebles'
  AND precio BETWEEN 20000 AND 50000;
nombreprecio
Teclado25990
Audífonos34990
Parlante49990

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

Practica SQL con ejercicios a tu nivel

En Coditer resuelves ejercicios en el navegador, con tests automáticos que revisan tu código y una IA que te da pistas cuando te atascas. Practicar es gratis.