filtrado-datos-where-sql

Filtrado de datos con WHERE en SQL

  • 4 min

En el artículo anterior aprendimos a seleccionar columnas con SELECT. Sin embargo, si ejecutamos un SELECT sin más, la base de datos nos devuelve todas las filas de la tabla.

Si tu tabla tiene diez registros, no pasa nada. Pero si trabajas con la tabla de ventas de Amazon, intentar traer todas las filas bloqueará tu aplicación y dejará el servidor llorando durante un rato💥.

Para evitar esto, necesitamos filtrar qué filas queremos recuperar. Aquí entra en juego la cláusula WHERE.

La cláusula WHERE

La cláusula WHERE especifica una condición que debe cumplir cada fila para ser incluida en el resultado.

Funciona como un portero de discoteca: analiza cada fila, comprueba si cumple la regla y, si es así, la deja pasar. Si no, la descarta.

La sintaxis básica es,

SELECT Columna1, Columna2
FROM Tabla
WHERE Condición;
Copied!

Por ejemplo, si queremos obtener solo los clientes que viven en “Madrid”:

SELECT Nombre, Apellido, Ciudad
FROM Clientes
WHERE Ciudad = 'Madrid';
Copied!

Filtrando por diferentes tipos de datos

Dependiendo de qué tipo de información guardemos, la forma de escribir la condición cambia ligeramente.

Es lo más sencillo. No utilizamos comillas.

SELECT * FROM Productos
WHERE Precio = 100;

Copied!

Como vimos en la sintaxis básica, en SQL los literales de texto deben ir entre comillas simples '.

SELECT * FROM Empleados
WHERE Apellido = 'Llamas';
Copied!

Recuerda que SQL Server puede ser Case Sensitive (distingue mayúsculas) o no, dependiendo de la Collation configurada.

En la mayoría de instalaciones por defecto, WHERE Apellido = 'llamas' funcionaría igual, pero en entornos estrictos no.

Las fechas también van entre comillas simples. El formato más seguro para evitar confusiones (¿es 01/02 el 1 de febrero o el 2 de enero?) es el formato ISO estándar: 'YYYYMMDD' o 'YYYY-MM-DD'.

SELECT * FROM Pedidos
WHERE FechaPedido = '20230915'; -- 15 de Septiembre de 2023

Copied!

El problema de los NULOS (IS NULL)

En SQL, NULL significa “ausencia de valor” o “desconocido”. NULL no es igual a nada, ni siquiera a otro NULL.

Si intentas hacer esto, no funcionará:

SELECT * FROM Clientes
WHERE Telefono = NULL; -- Esto devuelve 0 filas siempre  
Copied!

Como no podemos saber si un valor desconocido es igual a otro, la comparación lógica falla (devuelve UNKNOWN).

Para filtrar nulos, debemos usar los operadores especiales IS NULL y IS NOT NULL.

-- Forma correcta: Clientes sin teléfono
SELECT * FROM Clientes
WHERE Telefono IS NULL;

-- Forma correcta: Clientes que SÍ tienen teléfono
SELECT * FROM Clientes
WHERE Telefono IS NOT NULL;
Copied!

Rendimiento: Full Scan vs Index Seek

El WHERE no solo sirve para que la aplicación reciba menos datos; Combinada con índices, es la herramienta principal para optimizar el rendimiento.

  • Sin WHERE: El motor tiene que leer toda la tabla (Full Table Scan). Si la tabla tiene 100 millones de filas, leerá las 100 millones.
  • Con WHERE: Si tenemos un Índice en la columna que filtramos (por ejemplo, ID), SQL Server puede ir directamente a la fila que busca sin leer el resto (Index Seek).

Es la diferencia entre leer un libro entero para encontrar una frase o ir directamente al índice del final y saltar a la página correcta.