Lección 8 de 25· WHERE: filtrar filas
En el módulo anterior aprendiste a elegir columnas con SELECT. Pero una consulta como SELECT * FROM productos te devuelve todas las filas, y casi nunca quieres todas. En el trabajo real las preguntas suenan así:
Todas esas preguntas filtran filas según una condición. Esa es exactamente la tarea de la cláusula WHERE. Al terminar esta lección podrás escribir condiciones con los seis operadores de comparación (=, <>, <, >, <=, >=) para quedarte solo con las filas que te interesan.
Trabajamos sobre
tienda_tech, la base de datos de una tienda de tecnología con dos tablas:productos(el catálogo) yventas(cada transacción). Es el mismo dataset de todo el curso, así que las consultas que escribas aquí te servirán tal cual en las siguientes lecciones.
WHERE se escribe después de FROM y recibe una condición. La base de datos evalúa esa condición fila por fila: si para una fila la condición es verdadera, la fila entra en el resultado; si es falsa, se descarta.
SELECT columnas
FROM tabla
WHERE condición;Piénsalo como un portero en la puerta: revisa cada fila de una en una y solo deja pasar las que cumplen la regla. Ejecuta este primer ejemplo, que se queda solo con los productos de la categoría Monitores:
-- Solo las filas cuya categoría es exactamente 'Monitores'
SELECT nombre, categoria, precio
FROM productos
WHERE categoria = 'Monitores';De las 12 filas del catálogo, solo salieron 2: las dos que cumplen categoria = 'Monitores'. El operador = compara por igualdad exacta.
Dos detalles clave que ya viste en acción:
'Monitores', no "Monitores". En PostgreSQL las comillas dobles son para nombres de columnas o tablas, no para valores de texto.'monitores' (en minúscula) no encontraría nada, porque en la tabla está guardado como 'Monitores'.Una condición compara un valor de la fila (normalmente una columna) con otro valor usando uno de estos operadores:
| Operador | Significado | Ejemplo | Se cumple cuando… |
|---|---|---|---|
= | igual a | precio = 199000 | el precio es exactamente 199000 |
<> | distinto de | categoria <> 'Audio' | la categoría no es Audio |
< | menor que | stock < 10 | el stock es menor a 10 |
> | mayor que | precio > 500000 | el precio supera 500000 |
<= | menor o igual que | stock <= 0 | el stock es 0 o negativo |
>= | mayor o igual que | cantidad >= 3 | se vendieron 3 o más unidades |
El operador «distinto de» estándar es
<>. PostgreSQL también acepta!=como sinónimo, pero<>es el que funciona en todas las bases de datos; acostúmbrate a ese.
Los operadores <, >, <= y >= funcionan igual de bien con números. Esta consulta responde «¿qué productos cuestan más de 500.000?»:
-- Productos con precio mayor a 500000
SELECT nombre, categoria, precio
FROM productos
WHERE precio > 500000;Fíjate en la diferencia entre > y >=. Un producto que costara exactamente 500000 no aparecería con precio > 500000, pero sí con precio >= 500000. Cuando el límite importa (por ejemplo «al menos 500.000»), elige el operador con el = incluido.
Ahora cambiemos de tabla. Esta consulta filtra la tabla ventas para responder «¿qué ventas ocurrieron en Bogotá?»:
-- Todas las ventas de la ciudad de Bogotá
SELECT fecha, producto, ciudad, cantidad
FROM ventas
WHERE ciudad = 'Bogotá';<>A veces quieres justo lo contrario: todas las filas excepto las que cumplen algo. Para eso está <>. Esta consulta lista todas las ventas que no fueron en Bogotá:
-- Ventas de cualquier ciudad que no sea Bogotá
SELECT fecha, producto, ciudad
FROM ventas
WHERE ciudad <> 'Bogotá';La tabla productos tiene 12 filas. La siguiente consulta busca los productos agotados, es decir, con stock igual a 0. Antes de darle a ejecutar, mira el catálogo mentalmente: ¿cuántas filas crees que saldrán? Luego ejecútala y comprueba tu predicción.
-- Productos agotados: sin unidades en stock
SELECT nombre, categoria, stock, activo
FROM productos
WHERE stock = 0;Salen exactamente 2 filas (Monitor 24" Full HD y Webcam 1080p), las únicas con stock = 0. Si predijiste ese número, ya estás pensando como piensa la base de datos: recorriendo fila por fila y quedándote solo con las que cumplen la condición.
Merece la pena ver el mecanismo con calma, porque entenderlo evita casi todos los errores de principiante. Para WHERE stock = 0, la base de datos hace, literalmente, esto con cada fila del catálogo:
La condición nunca mira «la tabla entera» de golpe: solo sabe responder verdadero/falso para una fila a la vez. Por eso una condición siempre se escribe en términos de una sola fila (stock = 0, ciudad = 'Bogotá'), nunca sobre el conjunto completo.
1. Usar = cuando querías <>. Son opuestos y es facilísimo confundirlos al leer una pregunta de negocio. «Productos que no sean accesorios» es categoria <> 'Accesorios', no =. Lee la condición en voz alta: si dice «no es / distinto de / excepto», necesitas <>.
2. Olvidar las comillas simples en el texto (o usar comillas dobles). El texto siempre va entre comillas simples. Compara estas dos consultas: la primera es correcta; la segunda falla porque PostgreSQL interpreta "Bogotá" como el nombre de una columna llamada Bogotá, que no existe.
-- ✅ Correcto: el valor de texto va entre comillas SIMPLES
SELECT fecha, ciudad FROM ventas WHERE ciudad = 'Bogotá';-- ❌ Error: las comillas DOBLES hacen que PostgreSQL busque
-- una columna llamada Bogotá (no existe) en vez del texto 'Bogotá'.
-- Ejecútalo para ver el mensaje: column "Bogotá" does not exist
SELECT fecha, ciudad FROM ventas WHERE ciudad = "Bogotá";Ese mensaje de error (column "Bogotá" does not exist) es uno de los más comunes al empezar. Cuando lo veas, revisa que tus valores de texto lleven comillas simples. Los números, en cambio, van sin comillas: precio > 500000, nunca precio > '500000'.
Toca ponerlo en práctica y recibir corrección automática. Lee el enunciado, completa la consulta y pulsa Comprobar. El resultado sale en el orden natural en que están las filas en la tabla (por eso las filas de enero aparecen antes que las de febrero); todavía no usamos ORDER BY —lo verás en el módulo siguiente—, así que respeta ese orden.
Escribe una consulta sobre la tabla ventas que devuelva las filas donde se vendieron 3 o más unidades. Selecciona las columnas producto, ciudad y cantidad. El resultado debe salir en el orden en que están las filas en la tabla (no añadas ORDER BY).
-- Lista las ventas en las que se vendieron 3 o MÁS unidades.
-- Muestra las columnas producto, ciudad y cantidad.
-- Pista: "3 o más" incluye el 3 exacto.
SELECT producto, ciudad, cantidad
FROM ventas
WHERE cantidad -- TODO: completa la condición
;WHERE filtra filas según una condición que se evalúa fila por fila.=, <>, <, >, <=, >=. <> significa «distinto de».>= / <= (con el =) cuando el valor límite debe entrar; usa > / < cuando debe quedar fuera.En la próxima lección combinarás varias condiciones a la vez con AND, OR y NOT para preguntas más ricas, como «monitores que cuesten más de 500.000 y estén en stock».
Responde antes de continuar: fijar el concepto ahora es lo que hace que se te quede.
Y una última pregunta de retención, con corrección automática. Escribe la consulta que responde «¿qué productos NO son de la categoría Accesorios?» mostrando su nombre y categoría:
Sobre la tabla productos, devuelve nombre y categoria de todos los productos cuya categoría no sea Accesorios. No añadas ORDER BY: deja el orden natural de la tabla.
-- Lista los productos que NO pertenecen a la categoría 'Accesorios'.
-- Muestra las columnas nombre y categoria, en el orden natural de la tabla.
SELECT nombre, categoria
FROM productos
WHERE -- TODO: completa la condición
;Gratis