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:

OperadorSignificado
=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;
nombrepreciostock
iPhone 15 Pro1299.9945
Samsung Galaxy S24899.9962
Google Pixel 8699.0038
Xiaomi 14599.9980

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';
nombreapellidosciudad
MaríaGarcía LópezMadrid
PedroFernández CastroMadrid

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;
nombreprecio
iPhone 15 Pro1299.99
Samsung Galaxy S24899.99
Google Pixel 8699.00
Xiaomi 14599.99
MacBook Air M31399.00
Lenovo ThinkPad X11549.00
ASUS ROG Zephyrus1899.99
Sofá 3 plazas599.00

Para encontrar productos con stock bajo:

SELECT nombre, stock
FROM productos
WHERE stock < 20;
nombrestock
ASUS ROG Zephyrus12
Lenovo ThinkPad X118
Sofá 3 plazas8
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';
idfecha_pedidoestadototal
122025-12-01 10:30:00procesando199.99
132025-12-03 14:00:00pendiente39.99
142025-12-05 11:15:00pendiente79.98
152025-12-08 09:30:00pendiente1549.00
162025-12-10 16:00:00cancelado699.00
172025-12-12 13:45:00cancelado49.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';
idcliente_idfecha_pedidototal
13102025-12-03 14:00:0039.99
1442025-12-05 11:15:0079.98
15112025-12-08 09:30:001549.00
18132025-12-15 10:00:00329.98
19142025-12-18 14:30:0059.99
23172026-01-03 10:45:0064.98
24182026-01-05 12:00:0029.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;
nombrepreciostock
Samsung Galaxy S24899.9962
Xiaomi 14599.9980
Camiseta téc. run.129.9965

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';
nombrepuestosalario
DanielVendedor32000.00
PatriciaVendedora32000.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;
nombrepreciostockvalor_inventario
iPhone 15 Pro1299.994558499.55
Samsung Galaxy S24899.996255799.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:

  1. FROM: MySQL identifica la tabla.
  2. WHERE: filtra las filas que no cumplen la condición.
  3. 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:

Simulador SQL
Ctrl+Enter para ejecutar

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