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.