Volver a la lista de artículos Artículos
Lectura de 10 minutos

La Guía Completa de la Cláusula SQL WHERE

Aprenda a utilizar la cláusula WHERE de SQL para filtrar filas. En este completo artículo, cubrimos los operadores de comparación y los operadores BETWEEN, IN, LIKE, AND, OR y NOT.

El filtrado de filas de salida es una de las primeras cosas que debe aprender al comenzar su viaje en SQL. En esta guía, veremos cómo usar la cláusula WHERE de SQL para filtrar filas en diferentes escenarios. Cubriremos casos de uso básicos y algunos más avanzados.

La Cláusula WHERE en SQL

Imaginemos que está trabajando en uno de sus primeros proyectos SQL y ejecutando sus primeras consultas SQL. Ya conoce la sintaxis básica de la sentencia SELECT y cómo recuperar columnas de una o dos tablas de su base de datos. Pero entonces te has dado cuenta de que muy a menudo no necesitas todos los registros de una tabla. Quiere aprender a filtrar la salida para devolver sólo algunos registros que cumplan ciertos criterios.

¿Quiere sólo los registros correspondientes a un cliente concreto? ¿O necesita recuperar la lista de los productos que tienen pocas existencias (por ejemplo, menos de 10 artículos)? ¿O tal vez quiera obtener la lista de los comerciales que trabajan en la sucursal X y que han tenido unas ventas superiores a la media en el último mes?

En todos estos casos, necesitará la cláusula SQL WHERE para filtrar los resultados. Esta cláusula introduce ciertas condiciones, como:

  • quantity < 100
  • price BETWEEN 100 AND 500
  • customer_name = ‘John Smith’.

Para que las condiciones de filtrado se ejecuten correctamente, la cláusula WHERE debe colocarse después de FROM y JOIN y antes de GROUP BY, HAVING y ORDER BY.

Por ejemplo, esta es una consulta SQL para obtener información sobre los libros publicados desde 2020, ordenados por el nombre del autor:

SELECT b.title, a.name, b.year
FROM books b
JOIN authors a
ON books.author_id = authors.id
WHERE b.year >= 2020
ORDER BY a.name;

Observe que hemos combinado información de dos tablas (books y authors) y hemos colocado la cláusula WHERE después de la condición de unión ON y antes de la cláusula ORDER BY. Puede obtener más información sobre la sintaxis correcta de la cláusula WHERE en esta guía para principiantes.

También puede ser una buena idea empezar a practicar WHERE desde el principio. En este caso, le recomiendo nuestro curso interactivo SQL para principiantes interactivo. Sus 129 ejercicios interactivos cubren conceptos clave de SQL, incluyendo las condiciones simples y complejas de WHERE.

Si quieres tener una visión general primero, continuemos explorando los operadores que puedes usar en la cláusula WHERE.

Operadores a utilizar con SQL WHERE

Puedes construir condiciones de filtrado tanto básicas como complejas en WHERE gracias a una amplia gama de operadores que se pueden utilizar para comparar valores en SQL. Revisaremos los principales que permiten filtrar por valores numéricos, cadenas, valores NULL y una lista de valores.

Valores numéricos

Para los valores numéricos, puedes utilizar estos operadores de comparación:

  • = Igual a.
  • != (o <>) No igual a.
  • < Menor que.
  • <= Menor o igual que.
  • > Mayor que.
  • >= Mayor o igual que.

Para ver cómo funcionan estos operadores en la práctica, vamos a poner algunos ejemplos. Para nuestros ejemplos, utilizaremos la siguiente tabla que incluye información sobre los vendedores: ID, nombre, apellido, salario anual, tasa de comisión, la comisión que recibieron en 2021 y el ID de su sucursal.

salespeople
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
22DembeZuma400000.1231540.705
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502
37IanGarvey430000.08NULL1
38IvanStepanov410000.08NULL1

En primer lugar, queremos obtener los registros de todos los vendedores cuyo salario anual sea igual o superior a 50.000 dólares. Podemos utilizar la siguiente consulta:

SELECT *
FROM salespeople
WHERE salary >= 50000;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
20ElisabethKeen590000.1445350.002
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502

Como era de esperar, obtuvimos la lista de vendedores cuyo salario es igual o superior a $50K.

A continuación, vamos a ver cómo podemos utilizar números flotantes en lugar de enteros con los operadores de comparación. Haremos una lista de todos los vendedores que, gracias a su larga experiencia en la empresa, tienen una tasa de comisión superior a 0,12:

SELECT *
FROM salespeople
WHERE commission_rate > 0.12;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002

Como hemos utilizado el operador no inclusivo > en la cláusula WHERE, sólo tenemos a los vendedores cuya tasa de comisión es estrictamente superior a 0,12. Esto excluye a aquellos cuya tasa es igual a 0,12.

Además, tenga en cuenta que hemos utilizado operadores de comparación con literales (es decir, 50000 y 0.12). Al filtrar registros, también podemos utilizar operadores de comparación con expresiones. Por ejemplo, hagamos una lista de los vendedores cuyas ganancias por comisiones en 2021 fueron mayores que su salario anual:

SELECT *
FROM salespeople
WHERE commission_2021 > salary;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
18DonaldRessler400000.1441345.752
21TomKeen410000.1241560.751

La consulta ha funcionado como se esperaba; vemos cuatro vendedores que aparentemente tuvieron unas ventas muy elevadas en 2021, de modo que sus ingresos por comisiones superaron su salario.

Llegados a este punto, deberías sentirte más o menos cómodo con los operadores de comparación demostrados anteriormente. Es hora de introducir un operador más que puede utilizar con valores numéricos en WHERE: el operador BETWEEN.

Para listar todos los vendedores cuya tasa de comisión está entre 0,10 y 0,14, puede utilizar la siguiente consulta:

SELECT *
FROM salespeople
WHERE commission_rate BETWEEN 0.10 AND 0.14;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
22DembeZuma400000.1231540.705
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502

Tenga en cuenta que el operador BETWEEN es inclusivo en los límites inferior y superior, por lo que el conjunto de resultados incluye los registros correspondientes a las tasas de comisión de 0,10 y 0,14.

Pasemos ahora a los operadores que puede utilizar con los valores de texto.

Valores de texto

En primer lugar, con los valores de texto, puede utilizar el siguiente conjunto de operadores de comparación que funcionan de forma similar con las cadenas que con los valores numéricos, pero en el caso de los valores de texto, los registros se ordenan y comparan alfabéticamente:

  • = Igual a.
  • != (o <>) No igual a.
  • < Menor que (aparece primero en el orden alfabético, es decir, a < b).
  • <= Menor o igual que.
  • > Mayor que (aparece después en el orden alfabético, es decir, b > a).
  • >= -Mayor o igual que.

Para obtener información sobre todos los vendedores cuyo apellido (ordenado alfabéticamente) es anterior a "Keen", utilizaríamos la siguiente consulta:

SELECT *
FROM salespeople
WHERE last_name < ‘Keen’;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
35HaroldCooper570000.1015450.502
37IanGarvey430000.08NULL1

Estos operadores de comparación funcionan bien con valores de texto. Sin embargo, tenga en cuenta que siempre incluimos comillas con los literales de cadena utilizados en las condiciones de WHERE (por ejemplo, 'Keen'). Además, mientras que algunas bases de datos no distinguen entre mayúsculas y minúsculas por defecto (por ejemplo, SQL Server, MySQL), otras sí lo hacen (por ejemplo, Oracle) y no devolverían ningún registro si se buscara "keen" en lugar de "Keen".

A menudo necesitamos mucha más flexibilidad con las cadenas que con los números, y es entonces cuando el operador LIKE resulta útil. Nos permite realizar un filtrado avanzado con valores de texto, especialmente cuando se combina con un comodín SQL (por ejemplo, "_" para un carácter que falta o "%" para cualquier número de caracteres).

Por ejemplo, si queremos listar todos los vendedores cuyo apellido empieza por K, podemos escribir la siguiente consulta SQL:

SELECT *
FROM salespeople
WHERE last_name LIKE ‘K%’;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
30KateKaplan540000.1025760.455

Lee este artículo si quieres saber más sobre cómo se pueden utilizar los comodines SQL para filtrar los registros con valores de texto en SQL.

Comparaciones con valores NULL

La combinación de operadores de comparación y valores NULL puede confundir a los principiantes de SQL debido a algunos comportamientos contraintuitivos. Por ejemplo, si probamos que un determinado valor es igual a NULL, el resultado será desconocido aunque el valor de la columna sea NULL. Como la cláusula WHERE requiere true condiciones, obtendrá cero filas con una condición como la siguiente:

SELECT *
FROM salespeople
WHERE commission_2021 = NULL;

Result:
Query has no result

La solución es utilizar los operadores IS NULL o IS NOT NULL. Así es como puede recuperar todos los registros que tengan NULL en la columna commision_2021:

SELECT *
FROM salespeople
WHERE commission_2021 IS NULL;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
37IanGarvey430000.08NULL1
38IvanStepanov410000.08NULL1

Consulte esta guía para ver más ejemplos del comportamiento de NULL con varios operadores de comparación.

Operador IN - Comprobación de una lista de valores

Por último, puede utilizar el operador IN para comprobar una lista de valores predefinida. Por ejemplo, supongamos que tiene una lista de empleados cuyos ingresos deben ser verificados. Puede recuperar los registros necesarios mediante una consulta SQL como ésta:

SELECT *
FROM salespeople
WHERE last_name IN (‘Kaplan’, ‘Gerard’, ‘Zuma’);
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
22DembeZuma400000.1231540.705
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005

¡Parece perfecto! Sin embargo, a menudo hay que tener en cuenta algunos matices de sintaxis al utilizar varios operadores en la cláusula WHERE. Para su comodidad, hemos preparado una hoja de trucos de 2 páginas SQL para principiantes que incluye numerosos ejemplos de operadores que se utilizan para filtrar la salida de una consulta SQL.

Combinando Condiciones de Filtrado en WHERE

En las consultas del mundo real, tener una sola condición en la cláusula WHERE es a menudo insuficiente. Por suerte, puede combinar diferentes condiciones de filtrado con los operadores AND, OR y NOT:

  • El operador AND muestra un registro si todas las condiciones son verdaderas.
  • El operador OR muestra un registro si alguna de las condiciones es verdadera.
  • El operador NOT muestra un registro si la condición correspondiente no es verdadera.

El funcionamiento de estos operadores se aclarará con ejemplos.

Para listar a todos los vendedores que trabajan en la sucursal #5 y que tienen un salario igual o mayor a $50K, utilice la siguiente consulta:

SELECT *
FROM salespeople
WHERE branch_id = 5 AND salary >= 50000;

Para obtener todos los registros cuyo apellido sea "Kaplan" o "Reddington", utilice la siguiente consulta:

SELECT *
FROM salespeople
WHERE last_name = ‘Kaplan’ OR last_name = ‘Reddington’;

Por último, para obtener información sobre todos los vendedores excepto los que trabajan en la sucursal nº 2, utilice esta consulta:

SELECT *
FROM salespeople
WHERE NOT branch_id = 2;

Si desea obtener más ejemplos del uso de AND, OR, y NOT, consulte este artículo.

Para construir condiciones de filtrado aún más complejas, puede combinar múltiples condiciones utilizando AND, OR, y NOT en la misma sentencia WHERE. Sin embargo, es importante recordar la precedencia de estos operadores en SQL: NO → Y → O. Para mayor claridad, es muy recomendable utilizar paréntesis, aunque no sean necesarios en un caso concreto.

Supongamos que queremos recuperar todos los registros en los que el apellido de un empleado sea 'Keen' o 'Park', sus ingresos por comisiones hayan sido superiores a su salario en 2021 y no esté trabajando en la sucursal nº 2. Esta es una posible consulta:

SELECT *
FROM salespeople
WHERE (last_name = ‘Keen’ OR last_name = ‘Park’) 
AND (commission_2021 > salary)
AND (NOT branch_id = 2);
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
21TomKeen410000.1241560.751

Y ya hemos terminado con los ejemplos. Si necesita más orientación sobre la cláusula WHERE con algunos ejemplos adicionales, lea más de nuestras guías para principiantes. Y luego, ¡practica, practica y practica!

¡Es hora de usar la cláusula WHERE de SQL!

La mejor manera de dominar cualquier concepto nuevo en SQL es probarlo en varias consultas. Para los principiantes, creo que el entorno más cómodo para practicar algo nuevo es en los cursos interactivos en línea - tienes todos los ejemplos listos para ti y puedes escribir consultas desde la comodidad de tu navegador.

Para practicar SQL WHERE, yo recomendaría empezar con nuestro curso interactivo SQL para principiantes interactivo. Cubre todo lo que necesitarás para empezar a recuperar datos de una base de datos, incluyendo la escritura de sofisticadas condiciones de filtrado.

Si quieres hacer más ejercicios prácticos, consulta la Ejercicio de SQL pista de aprendizaje. Incluye 5 cursos interactivos con cientos de desafíos de codificación.

Gracias por leer, y ¡feliz aprendizaje!