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: una expresión cuyo resultado puede determinar si la fila cumple la regla. 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
DATEADD desplaza una fecha una cantidad determinada de unidades. En DATEADD(DAY, 1, @FechaFinal), DAY indica la unidad, 1 la cantidad que se suma y @FechaFinal la fecha desde la que comienza el cálculo.
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, es decir, un orden predefinido para decidir qué operaciones evalúa primero. 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. Una conversión implícita ocurre cuando SQL Server cambia automáticamente un valor a otro tipo para poder compararlo. Comparar una columna numérica o de fecha con texto puede provocar esa conversión, producir un error o impedir que el plan aproveche un acceso eficiente.