WHERE
La cláusula WHERE filtra las filas que devuelve una consulta. Sin WHERE, el SELECT devuelve todas las filas de la tabla. Con WHERE, solo devuelve las filas que cumplen la condición que especifiques.
Sintaxis
SELECT columnas
FROM tabla
WHERE condicion;MySQL evalúa la condición del WHERE para cada fila de la tabla. Si la condición es verdadera, la fila se incluye en el resultado. Si es falsa o nula, la fila se descarta. Este procesamiento ocurre antes de que se aplique el SELECT, lo que significa que WHERE filtra sobre los datos originales de la tabla, no sobre alias o expresiones definidas en el SELECT.
Operadores de comparación
Los operadores de comparación son la base de las condiciones en WHERE. MySQL soporta los siguientes:
| Operador | Significado |
|---|---|
= | Igual a |
!= o <> | Distinto de |
> | Mayor que |
>= | Mayor o igual que |
< | Menor que |
<= | Menor o igual que |
Filtrar por igualdad
El operador = compara si un valor es exactamente igual a otro. Es el operador más utilizado en WHERE:
SELECT nombre, precio, stock
FROM productos
WHERE categoria_id = 6;| nombre | precio | stock |
|---|---|---|
| iPhone 15 Pro | 1299.99 | 45 |
| Samsung Galaxy S24 | 899.99 | 62 |
| Google Pixel 8 | 699.00 | 38 |
| Xiaomi 14 | 599.99 | 80 |
Esta consulta devuelve solo los productos de la categoría 6 (Smartphones). De los 30 productos en la tabla, solo 4 cumplen la condición.
Con cadenas de texto, el operador = compara valores sin distinguir mayúsculas y minúsculas por defecto (depende de la collation de la base de datos):
SELECT nombre, apellidos, ciudad
FROM clientes
WHERE ciudad = 'Madrid';| nombre | apellidos | ciudad |
|---|---|---|
| María | García López | Madrid |
| Pedro | Fernández Castro | Madrid |
Filtrar por desigualdad
El operador != (o su equivalente <>) devuelve las filas donde el valor no coincide:
SELECT nombre, estado, total
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id
WHERE estado != 'cancelado';Esta consulta excluye los pedidos cancelados y devuelve todos los demás. Ambas formas, != y <>, son equivalentes. La forma != es más común en la práctica, pero <> es la que define el estándar SQL.
Filtrar por comparación numérica
Los operadores >, >=, < y <= son especialmente útiles con precios, cantidades y fechas:
SELECT nombre, precio
FROM productos
WHERE precio > 500;| nombre | precio |
|---|---|
| iPhone 15 Pro | 1299.99 |
| Samsung Galaxy S24 | 899.99 |
| Google Pixel 8 | 699.00 |
| Xiaomi 14 | 599.99 |
| MacBook Air M3 | 1399.00 |
| Lenovo ThinkPad X1 | 1549.00 |
| ASUS ROG Zephyrus | 1899.99 |
| Sofá 3 plazas | 599.00 |
Para encontrar productos con stock bajo:
SELECT nombre, stock
FROM productos
WHERE stock < 20;| nombre | stock |
|---|---|
| ASUS ROG Zephyrus | 12 |
| Lenovo ThinkPad X1 | 18 |
| Sofá 3 plazas | 8 |
| Escritorio ajust. | 15 |
El operador <= incluye el valor límite. Si usas WHERE stock <= 20 en lugar de WHERE stock < 20, el resultado incluirá también los productos con exactamente 20 unidades, como las mancuernas ajustables.
Filtrar por fecha
Las fechas se escriben entre comillas simples en formato 'YYYY-MM-DD'. MySQL las compara cronológicamente:
SELECT id, fecha_pedido, estado, total
FROM pedidos
WHERE fecha_pedido >= '2025-12-01';| id | fecha_pedido | estado | total |
|---|---|---|---|
| 12 | 2025-12-01 10:30:00 | procesando | 199.99 |
| 13 | 2025-12-03 14:00:00 | pendiente | 39.99 |
| 14 | 2025-12-05 11:15:00 | pendiente | 79.98 |
| 15 | 2025-12-08 09:30:00 | pendiente | 1549.00 |
| 16 | 2025-12-10 16:00:00 | cancelado | 699.00 |
| 17 | 2025-12-12 13:45:00 | cancelado | 49.99 |
| ... | ... | ... | ... |
Esta consulta obtiene todos los pedidos realizados a partir del 1 de diciembre de 2025. El operador >= incluye ese día.
Para buscar pedidos de un día concreto, como fecha_pedido es de tipo DATETIME, no puedes usar = directamente con una fecha sin hora (devolvería solo los registros con hora 00:00:00). En su lugar, usa un rango:
SELECT id, fecha_pedido, total
FROM pedidos
WHERE fecha_pedido >= '2025-11-10'
AND fecha_pedido < '2025-11-11';Esto captura todos los registros del 10 de noviembre, independientemente de la hora.
Filtrar con ENUM
La tabla pedidos tiene una columna estado de tipo ENUM. Puedes filtrar por cualquiera de sus valores usando el operador =:
SELECT id, cliente_id, fecha_pedido, total
FROM pedidos
WHERE estado = 'pendiente';| id | cliente_id | fecha_pedido | total |
|---|---|---|---|
| 13 | 10 | 2025-12-03 14:00:00 | 39.99 |
| 14 | 4 | 2025-12-05 11:15:00 | 79.98 |
| 15 | 11 | 2025-12-08 09:30:00 | 1549.00 |
| 18 | 13 | 2025-12-15 10:00:00 | 329.98 |
| 19 | 14 | 2025-12-18 14:30:00 | 59.99 |
| 23 | 17 | 2026-01-03 10:45:00 | 64.98 |
| 24 | 18 | 2026-01-05 12:00:00 | 29.99 |
Combinar condiciones
Puedes combinar varias condiciones en un mismo WHERE usando los operadores lógicos AND y OR. Los veremos en detalle en la sección de operadores, pero aquí va un adelanto:
SELECT nombre, precio, stock
FROM productos
WHERE precio > 100
AND stock > 50;| nombre | precio | stock |
|---|---|---|
| Samsung Galaxy S24 | 899.99 | 62 |
| Xiaomi 14 | 599.99 | 80 |
| Camiseta téc. run. | 129.99 | 65 |
Con AND, ambas condiciones deben ser verdaderas. Solo aparecen los productos cuyo precio supera los 100 euros y cuyo stock supera las 50 unidades.
SELECT nombre, puesto, salario
FROM empleados
WHERE puesto = 'Vendedor'
OR puesto = 'Vendedora';| nombre | puesto | salario |
|---|---|---|
| Daniel | Vendedor | 32000.00 |
| Patricia | Vendedora | 32000.00 |
Con OR, basta con que una de las condiciones sea verdadera.
WHERE con expresiones
Puedes usar expresiones en la condición del WHERE, no solo columnas directas:
SELECT nombre, precio, stock, precio * stock AS valor_inventario
FROM productos
WHERE precio * stock > 50000;| nombre | precio | stock | valor_inventario |
|---|---|---|---|
| iPhone 15 Pro | 1299.99 | 45 | 58499.55 |
| Samsung Galaxy S24 | 899.99 | 62 | 55799.38 |
Observa que la expresión precio * stock aparece tanto en el SELECT (para mostrarla) como en el WHERE (para filtrar). No puedes usar el alias valor_inventario en el WHERE porque MySQL procesa el WHERE antes que el SELECT. Si intentas WHERE valor_inventario > 50000, obtendrás un error de columna desconocida.
Orden de procesamiento
Entender el orden en que MySQL procesa las cláusulas ayuda a evitar errores comunes. Para una consulta básica con SELECT, FROM y WHERE, el orden interno es:
- FROM: MySQL identifica la tabla.
- WHERE: filtra las filas que no cumplen la condición.
- SELECT: evalúa las expresiones y selecciona las columnas del resultado.
Esto explica por qué no puedes usar alias del SELECT en el WHERE: cuando el WHERE se ejecuta, los alias todavía no existen.
Practica con WHERE
Usa el editor para probar tus propias consultas con WHERE. Intenta filtrar productos por precio, buscar clientes por ciudad o pedidos por estado:
En los próximos artículos veremos cómo ordenar los resultados con ORDER BY y cómo limitar el número de filas con LIMIT.
Escrito por Eduardo Lázaro
