Contenido de esta guía
Qué decide WHERE
WHERE evalúa una condición para cada fila disponible. Solo pasan las filas cuyo resultado es verdadero. Las condiciones falsas y las que producen un valor desconocido —por ejemplo, ciertas comparaciones con NULL— quedan fuera.
El filtro ocurre antes de agrupar. Por eso WHERE trabaja con filas individuales, mientras que HAVING puede filtrar grupos ya calculados.
Sintaxis básica
SELECT columnas
FROM tabla
WHERE condicion;Una condición puede utilizar comparaciones, rangos, listas, patrones, comprobaciones de nulos y combinaciones con AND, OR y NOT.
Ejemplo guiado: clientes activos de Madrid
SELECT nombre,
ciudad
FROM clientes
WHERE activo = 1
AND ciudad = 'Madrid'
ORDER BY id;| nombre | ciudad |
|---|---|
| Ana Torres | Madrid |
| Marta Ruiz | Madrid |
| Noa Vidal | Madrid |
Cada fila debe cumplir las dos condiciones porque están unidas con AND. Una persona activa de otra ciudad no pasa; una persona de Madrid inactiva tampoco.
Agrupa la lógica con paréntesis
WHERE activo = 1
AND (ciudad = 'Madrid' OR ciudad = 'Bilbao')AND y OR tienen precedencias distintas. Los paréntesis hacen visible la intención y reducen errores al ampliar el filtro.
NULL necesita operadores propios
SELECT nombre
FROM clientes
WHERE email IS NULL
ORDER BY id;El resultado contiene a Diego López, Pablo Sanz y Mario Gil. No uses email = NULL: esa comparación no produce verdadero. Utiliza IS NULL o IS NOT NULL.
Antes de un UPDATE o DELETE, prueba el mismo WHERE con SELECT. Comprueba las filas afectadas y solo después ejecuta la modificación dentro de una transacción cuando el motor y el entorno lo permitan.
Error frecuente: filtrar un alias calculado
SELECT precio * stock AS valor_stock
FROM productos
WHERE valor_stock > 500;En SQL portable, WHERE no puede usar ese alias de salida. Repite la expresión o calcula el alias en una consulta interior.
Práctica: productos disponibles de precio medio
Filtra inventario útil
Devuelve nombre, precio y stock de los productos con existencias y precio entre 50 y 200, incluidos ambos límites. Ordena por precio e id.
stock > 0.BETWEEN 50 AND 200.AND.Solución razonada
SELECT nombre,
precio,
stock
FROM productos
WHERE stock > 0
AND precio BETWEEN 50 AND 200
ORDER BY precio, id;Devuelve Auriculares, Disco SSD y Monitor 24. BETWEEN incluye 50 y 200, aunque en estos datos no hay productos exactamente en esos límites.
Compatibilidad entre motores
Las comparaciones y conectores básicos son comunes. Las diferencias aparecen en tipos booleanos, sensibilidad a mayúsculas, funciones, conversiones implícitas y operadores específicos. Para valores ausentes, IS NULL es la forma portable.
Qué debes recordar
WHEREconserva condiciones verdaderas.- Usa paréntesis cuando combines
ANDyOR. - Comprueba
NULLconIS NULL. - Valida el filtro con SELECT antes de modificar datos.