La cláusula WHERE en SQL se utiliza para filtrar filas de una consulta en base a una condición lógica.
Permite devolver solo aquellos registros que cumplen con uno o varios criterios, en lugar de procesar la tabla completa.
👉 Sin WHERE
, todos los registros de la tabla son afectados por la consulta (SELECT
, UPDATE
, DELETE
).
Sintaxis básica de WHERE
SELECT columna1, columna2, ...
FROM tabla
WHERE condición;
La condición puede usar:
- Comparaciones (
=
,<>
,>
,<
,>=
,<=
). - Operadores lógicos (
AND
,OR
,NOT
). - Funciones (
BETWEEN
,IN
,LIKE
,IS NULL
, etc.).
Ejemplo básico de WHERE
SELECT *
FROM empleados
WHERE departamento = 'Ventas';
👉 Devuelve solo los empleados del departamento de Ventas.
WHERE con operadores de comparación
-- Mayor que
SELECT * FROM productos WHERE precio > 100;
-- Diferente de
SELECT * FROM empleados WHERE cargo <> 'Gerente';
-- Menor o igual
SELECT * FROM pedidos WHERE cantidad <= 50;
WHERE con operadores lógicos
-- Dos condiciones (AND)
SELECT * FROM clientes
WHERE pais = 'España' AND ciudad = 'Madrid';
-- Una u otra (OR)
SELECT * FROM clientes
WHERE ciudad = 'Madrid' OR ciudad = 'Barcelona';
-- Negación (NOT)
SELECT * FROM productos
WHERE NOT categoria = 'Electrónica';
WHERE con BETWEEN
SELECT * FROM ventas
WHERE fecha BETWEEN '2025-01-01' AND '2025-03-31';
👉 Filtra ventas del primer trimestre de 2025.
WHERE con IN
SELECT * FROM pedidos
WHERE estado IN ('Pendiente','Enviado');
👉 Equivalente a varias condiciones OR
.
WHERE con LIKE (patrones de texto)
-- Empieza con A
SELECT * FROM clientes WHERE nombre LIKE 'A%';
-- Termina en "ez"
SELECT * FROM clientes WHERE apellido LIKE '%ez';
-- Contiene "tech"
SELECT * FROM empresas WHERE nombre LIKE '%tech%';
WHERE con IS NULL / IS NOT NULL
SELECT * FROM facturas
WHERE fecha_pago IS NULL;
SELECT * FROM facturas
WHERE fecha_pago IS NOT NULL;
👉 Diferencia entre campos vacíos y nulos.
WHERE con subqueries
SELECT nombre
FROM clientes
WHERE id IN (
SELECT cliente_id FROM pedidos WHERE total > 1000
);
👉 Devuelve clientes que tienen pedidos por más de 1000.
WHERE en UPDATE y DELETE
Además de SELECT
, WHERE
se usa en modificaciones:
UPDATE empleados
SET salario = salario * 1.1
WHERE departamento = 'IT';
DELETE FROM usuarios
WHERE activo = FALSE;
👉 Sin WHERE
, todos los empleados o usuarios serían afectados.
Ejemplo combinado con múltiples condiciones
SELECT * FROM empleados
WHERE (departamento = 'Ventas' OR departamento = 'Marketing')
AND salario > 2000
AND fecha_contratacion >= '2024-01-01';
👉 Devuelve empleados de Ventas o Marketing, con salario > 2000 y contratados desde 2024.
Precedencia en condiciones de WHERE
- Primero se evalúa
NOT
. - Luego
AND
. - Luego
OR
.
👉 Usar paréntesis aclara y evita errores.
Ejemplo:
-- Correcto
SELECT * FROM empleados
WHERE departamento = 'Ventas' OR (departamento = 'Marketing' AND salario > 2000);
Errores comunes con WHERE
- Olvidar comillas en cadenas de texto
WHERE nombre = Juan; -- ❌ Error
WHERE nombre = 'Juan'; -- ✅ Correcto
- Confundir NULL con cadena vacía
WHERE columna = NULL; -- ❌ Nunca devuelve nada
WHERE columna IS NULL; -- ✅ Correcto
- Usar condiciones ambiguas
WHERE precio > 100 OR < 50; -- ❌ Incorrecto
WHERE precio > 100 OR precio < 50; -- ✅ Correcto
- No usar paréntesis
👉 Puede cambiar la lógica de evaluación.
Buenas prácticas con WHERE
- Siempre validar con un
SELECT
antes de unDELETE
oUPDATE
. - Usar paréntesis para mayor claridad en expresiones lógicas.
- Crear índices en columnas que se usan frecuentemente en
WHERE
. - Evitar funciones en columnas de filtro (ejemplo:
WHERE YEAR(fecha) = 2025
→ puede impedir uso de índices). - Usar
BETWEEN
yIN
para simplificar múltiples condiciones.
Casos de uso comunes de WHERE
- Filtrar clientes por ubicación.
- Seleccionar pedidos por rango de fechas.
- Encontrar productos fuera de stock.
- Identificar empleados con sueldos fuera de rango.
- Actualizar registros específicos según condiciones.
WHERE en distintos motores de base de datos
- MySQL / MariaDB → soporte completo, muy usado con índices.
- PostgreSQL → soporta expresiones avanzadas, subqueries y operadores personalizados.
- SQL Server → además de las funciones estándar, soporta condiciones con
TOP
en combinación. - Oracle → admite condiciones complejas con funciones analíticas.
- SQLite → soporte completo, aunque limitado en funciones avanzadas.
Preguntas frecuentes (FAQ)
1. ¿Qué pasa si no pongo WHERE en una consulta?
- En
SELECT
: devuelve todas las filas. - En
DELETE
: borra todas las filas. - En
UPDATE
: modifica todas las filas.
2. ¿Puedo usar funciones en WHERE?
Sí, pero puede impactar el rendimiento (ej. WHERE LOWER(nombre) = 'ana'
).
3. ¿Cuál es más rápido: IN o múltiples OR?
Generalmente IN
es más eficiente y legible.
4. ¿Puedo usar subconsultas en WHERE?
Sí, tanto escalares como de múltiples filas.
5. ¿WHERE es lo mismo que HAVING?
No. WHERE
filtra filas antes de agrupar; HAVING
filtra después de GROUP BY
.
Conclusión
La cláusula WHERE en SQL es esencial para trabajar con bases de datos:
- Permite filtrar registros según condiciones.
- Se aplica en
SELECT
,UPDATE
yDELETE
. - Se combina con operadores, funciones y subqueries.
- Evita errores críticos, como modificar todas las filas por accidente.
Dominar WHERE
es el primer gran paso para hacer consultas eficientes y precisas.
Perfecciona filtros y operadores en WHERE y condiciones y repasa más conceptos en el Glosario SQL completo.