Curso
Filtrar filas de una tabla según una condición (o varias) es una práctica muy habitual en análisis de datos. En SQL, puedes hacerlo con la cláusula where. En este tutorial, la usarás en distintos escenarios.
Utilizarás PostgreSQL como SGBD (sistema de gestión de bases de datos relacional), aunque la sintaxis apenas cambia al usar otros sistemas. Empezarás configurando una base de datos PostgreSQL y creando manualmente una tabla con datos de países. Una vez lista, ejecutarás varias consultas de filtrado con la cláusula WHERE.
Nota: Para seguir el tutorial, deberías conocer los fundamentos de SQL y PostgreSQL. Si no es tu caso, estos recursos pueden ayudarte:
Crear una tabla en PostgreSQL
Para seguir este tutorial, necesitas crear una tabla en PostgreSQL con información sobre países de todo el mundo. Usaremos esta tabla para mostrar cómo funciona la cláusula WHERE en diferentes casos.
Paso 1: crea una base de datos nueva
Abre pgAdmin (o tu interfaz de SQL preferida) y crea una nueva base de datos de PostgreSQL. Puedes llamarla, por ejemplo, world_data o como prefieras.
Paso 2: crea y rellena la tabla
Cuando la base de datos esté lista, abre una ventana de editor de consultas y ejecuta el siguiente código SQL. Creará una tabla llamada countries e insertará un conjunto de registros que cubren varios continentes, años de independencia y regiones:
-- Create the countries tableCREATE TABLE countries ( code VARCHAR(3) PRIMARY KEY, name VARCHAR(100), continent VARCHAR(50), region VARCHAR(100), surface_area NUMERIC, indep_year INTEGER, local_name VARCHAR(100), gov_form VARCHAR(100), capital VARCHAR(100), cap_long NUMERIC, cap_lat NUMERIC);-- Insert sample data into the countries tableINSERT INTO countries (code, name, continent, region, surface_area, indep_year, local_name, gov_form, capital, cap_long, cap_lat)VALUES('IND', 'India', 'Asia', 'Southern Asia', 3287263, 1947, 'Bharat', 'Federal Republic', 'New Delhi', 77.2090, 28.6139),('PAK', 'Pakistan', 'Asia', 'Southern Asia', 881912, 1947, 'Pakistan', 'Federal Republic', 'Islamabad', 73.0551, 33.6844),('CHN', 'China', 'Asia', 'Eastern Asia', 9596961, NULL, 'Zhongguo', 'People''s Republic', 'Beijing', 116.4074, 39.9042),('VNM', 'Vietnam', 'Asia', 'South-Eastern Asia', 331212, 1945, 'Việt Nam', 'Socialist Republic', 'Hanoi', 105.8544, 21.0285),('JPN', 'Japan', 'Asia', 'Eastern Asia', 377975, NULL, 'Nippon', 'Constitutional Monarchy', 'Tokyo', 139.6917, 35.6895),('DEU', 'Germany', 'Europe', 'Western Europe', 357386, 1955, 'Deutschland', 'Federal Republic', 'Berlin', 13.4050, 52.5200),('FRA', 'France', 'Europe', 'Western Europe', 551695, 843, 'France', 'Republic', 'Paris', 2.3522, 48.8566),('RUS', 'Russia', 'Europe', 'Eastern Europe', 17098242, 1991, 'Rossiya', 'Federation', 'Moscow', 37.6173, 55.7558),('UKR', 'Ukraine', 'Europe', 'Eastern Europe', 603500, 1991, 'Ukrayina', 'Republic', 'Kyiv', 30.5234, 50.4501),('EGY', 'Egypt', 'Africa', 'Northern Africa', 1002450, 1922, 'Misr', 'Republic', 'Cairo', 31.2357, 30.0444),('NGA', 'Nigeria', 'Africa', 'Western Africa', 923768, 1960, 'Nigeria', 'Federal Republic', 'Abuja', 7.4951, 9.0578),('AUS', 'Australia', 'Oceania', 'Australia and New Zealand', 7682300, 1901, 'Australia', 'Federal Parliamentary Democracy', 'Canberra', 149.1245, -35.3075),('USA', 'United States', 'North America', 'North America', 9833517, 1776, 'United States', 'Federal Republic', 'Washington, D.C.', -77.0369, 38.9072),('CAN', 'Canada', 'North America', 'North America', 9984670, 1867, 'Canada', 'Constitutional Monarchy', 'Ottawa', -75.6972, 45.4215),('BRA', 'Brazil', 'South America', 'South America', 8515767, 1822, 'Brasil', 'Federal Republic', 'Brasília', -47.9292, -15.7801),('ARG', 'Argentina', 'South America', 'South America', 2780400, 1816, 'Argentina', 'Federal Republic', 'Buenos Aires', -58.3816, -34.6037);La tabla incluye distinta información sobre unos 16 países de todo el mundo. Contiene las siguientes columnas:
code, clave primaria de la tabla, que indica el código universal del paísname, el nombre del paíscontinent, el continente al que perteneceregion, la zona geográfica donde se ubicasurface_area, la superficie del paísindep_year, el año en que obtuvo su independencialocal_name, el nombre localgov_form, el tipo de gobierno vigentecapital, su capitalcap_long, la longitud de la capitalcap_lat, la latitud de la capital
Ahora sí, empecemos a filtrar registros con la cláusula WHERE.
Uso de la cláusula WHERE de SQL
En SQL, la cláusula WHERE te permite filtrar registros según valores tanto textuales como numéricos. Puedes compararlos con las siguientes operaciones de comparación:
=igual<>y!=distinto<menor que>mayor que<=menor o igual que>=mayor o igual que
Según el estándar SQL, se recomienda usar <> en lugar de !=.
Vamos a obtener ahora el registro del país cuyo code es AUS. La columna a comparar es code y el valor, AUS. La consulta sería:
SELECT * FROM countries WHERE code = 'AUS';Y obtienes:

Fíjate en un par de detalles:
La cláusula
WHEREsiempre va después deFROM.En SQL, las cadenas de texto se escriben entre comillas simples.
Veamos ahora una comparación numérica. Recuperemos los países que obtuvieron su independencia (indep_year) después de 1901:
SELECT * FROM countries WHERE indep_year > 1901;Obtendrás los registros de un total de 3 países que lograron su independencia después de 1901. Ten en cuenta el comparador utilizado. La columna indep_year es de tipo entero. Por tanto, no se usan comillas en la comparación.
Puedes combinar varias condiciones en una cláusula WHERE con los conectores AND y OR. La siguiente consulta devuelve los países where continent = 'Asia' and indep_year > 1900:
SELECT * FROM countries WHERE continent = 'Asia' AND indep_year > 1901;
Obtienes información de tres países situados en el continente de Asia que lograron su independencia después de 1901. Observa que en la consulta anterior comparaste valores textuales y numéricos. Como ejercicio, prueba distintas combinaciones de AND y OR en la cláusula WHERE.
Nota: Cuando combines AND y OR, no olvides encerrar cada condición entre paréntesis. De lo contrario, SQL puede interpretar mal la precedencia de evaluación.
Con la siguiente consulta, obtienes un total de seis países.
SELECT * FROM countries WHERE(continent = 'Europe' AND indep_year > 1900)or(continent = 'Asia' AND indep_year > 1900);
También puedes encadenar más de dos condiciones en una cláusula WHERE:
SELECT * FROM countries WHERE continent = 'Asia' OR indep_year > 1900 OR surface_area > 652090;
Aquí obtienes un total de 15 países que están en Asia, o bien lograron su independencia después de 1901, o bien tienen una superficie mayor que 652090.
Convirtamos ahora la consulta en una variante con AND, que es más restrictiva:
SELECT * FROM countries WHERE continent = 'Asia' AND indep_year > 1901 AND surface_area > 652090;
En este caso obtendrás dos países.
También puedes utilizar subconsultas en una cláusula WHERE. Imagina que quieres recuperar el país con la mayor superficie, pero no conoces el valor máximo. En situaciones así, la siguiente consulta te saca del apuro:
SELECT * FROM countries WHERE surface_area in (SELECT MAX(surface_area) FROM countries);Deberías obtener el registro de Russia.

Conclusión
¡Enhorabuena! Has completado este tutorial. Filtrar resultados de consulta según condiciones es una habilidad clave, y aquí has visto una introducción práctica. Si quieres llevar aún más lejos tus habilidades de SQL, echa un vistazo a nuestros cursos (enlace abajo).
Certifícate en SQL

Sayak trabaja en Hugging Face, donde codifica, escribe y habla. Su tiempo lo dedica principalmente a todo lo relacionado con la biblioteca de los Difusores. También es instructor de proyectos DataCamp y autor de muchos tutoriales DataCamp. Fuera del trabajo, le verás viendo Suits en Netflix por enésima vez.
SQL: preguntas frecuentes sobre la cláusula WHERE
¿Puedo usar columnas de texto y numéricas en una cláusula WHERE?
Sí, puedes filtrar tanto por texto (p. ej., 'Asia') como por valores numéricos (p. ej., > 1901). Solo recuerda que los valores de texto deben ir entre comillas simples.
¿Hay diferencia entre <> y != en SQL?
Ambos significan "distinto", pero <> es el operador estándar de SQL. Algunas bases de datos también admiten !=, pero es mejor usar <> por compatibilidad.
¿Cómo filtro registros con valores NULL?
Usa IS NULL o IS NOT NULL. Por ejemplo:
SELECT * FROM countries WHERE indep_year IS NULL;¿Puedo usar subconsultas en una cláusula WHERE?
Sí, puedes usar subconsultas para comparar una columna con el resultado de otra consulta. Por ejemplo:
SELECT * FROM countries WHERE surface_area = (SELECT MAX(surface_area) FROM countries);¿La cláusula WHERE va antes o después de FROM?
La cláusula WHERE siempre va después de FROM y antes de cláusulas como GROUP BY u ORDER BY.
¿Puedo usar WHERE con JOINs?
Por supuesto. Puedes aplicar la cláusula WHERE después de realizar un JOIN para filtrar el conjunto de resultados combinado.

