WHERE: decidir qué filas cumplen la condición
Seleccionar las columnas correctas no siempre es suficiente. Podemos necesitar únicamente clientes activos, pedidos confirmados o movimientos ocurridos dentro de un periodo.
WHERE permite expresar esa condición antes de devolver el resultado.
La idea
Cada fila se evalúa contra una condición lógica. Si la condición es verdadera, la fila continúa en el resultado. Si es falsa o desconocida, queda fuera.
La tercera posibilidad, desconocida, aparece especialmente al trabajar con NULL. Por eso un valor nulo no se compara mediante = NULL.
Sintaxis
SELECT
Columna1,
Columna2
FROM dbo.Tabla
WHERE Condicion;
Las condiciones pueden utilizar comparaciones como =, <>, >, >=, < y <=. También pueden combinarse mediante AND, OR y NOT.
Ejemplo: comparar y combinar condiciones
Para obtener productos activos cuyo precio sea de al menos 300 pesos:
SELECT
p.IdProducto,
p.Nombre,
p.Precio
FROM dbo.Producto AS p
WHERE p.Activo = 1
AND p.Precio >= 300
ORDER BY p.Precio;
Las dos condiciones deben cumplirse porque están unidas mediante AND.
| IdProducto | Nombre | Precio |
|---|---|---|
| 1 | Adaptador USB-C | 349.00 |
| 4 | Teclado compacto | 629.90 |
| 3 | Soporte para monitor | 799.00 |
Variaciones frecuentes
Buscar dentro de una lista
SELECT
p.IdPedido,
p.IdCliente,
p.Estado
FROM dbo.Pedido AS p
WHERE p.Estado IN ('Confirmado', 'Enviado');
IN evita repetir la misma columna en varias comparaciones unidas con OR.
Buscar por un patrón
SELECT
c.IdCliente,
c.Nombre
FROM dbo.Cliente AS c
WHERE c.Nombre LIKE N'A%';
El símbolo % representa cualquier cantidad de caracteres. En este caso, el nombre debe comenzar con A.
Encontrar valores nulos
SELECT
c.IdCliente,
c.Nombre
FROM dbo.Cliente AS c
WHERE c.Correo IS NULL;
Para solicitar lo contrario se utiliza IS NOT NULL.
Filtrar un periodo con hora
DECLARE @FechaInicial DATE = '2026-03-01';
DECLARE @FechaFinal DATE = '2026-03-04';
SELECT
p.IdPedido,
p.FechaPedido,
p.Estado
FROM dbo.Pedido AS p
WHERE p.FechaPedido >= @FechaInicial
AND p.FechaPedido < DATEADD(DAY, 1, @FechaFinal);
El límite superior es exclusivo. Así incluimos todas las horas del 4 de marzo sin depender de que la columna guarde segundos, milisegundos o una precisión mayor.
Qué conviene comprobar
Cuando una condición mezcla AND y OR, los paréntesis hacen explícita la intención:
WHERE p.Activo = 1
AND (p.Precio < 300 OR p.Existencia = 0);
Sin los paréntesis, SQL aplica su precedencia de operadores. La consulta puede ser válida y aun así devolver un conjunto distinto del que esperábamos.
También conviene revisar el tipo de dato. Comparar una columna numérica o de fecha con texto puede provocar conversiones implícitas, errores o planes menos eficientes.
Relacionado con
- Operadores de comparación y lógicos.
CASE: produce un valor según una condición, pero no sustituye el control de flujo.- Funciones de fecha.
HAVING: filtra después de una agrupación.