SQL desde cero · lección 4 de 6
La pregunta que cae en casi todos los exámenes: cuándo se usa WHERE, cuándo HAVING y qué pasa si usas los dos.
WHERE filtra filas, antes de agrupar. HAVING filtra grupos, después de agrupar. Por eso WHERE COUNT(*) > 2 da error: cuando se aplica el WHERE todavía no hay nada contado.
El orden en que se escribe una consulta completa es siempre el mismo: SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT ….
Se pueden usar los dos a la vez: primero WHERE decide qué filas entran, luego se agrupa y luego HAVING decide qué grupos salen.
robos
| id | sospechoso_id | ciudad | botin |
|---|---|---|---|
| 1 | 2 | Puerto Sal | 1200 |
| 2 | 2 | Puerto Sal | 800 |
| 3 | 4 | San Ciro | 300 |
| 4 | 5 | Puerto Sal | 5000 |
| 5 | 8 | Puerto Sal | 450 |
| 6 | 8 | Bahía Lumen | 950 |
| 7 | 8 | San Ciro | 150 |
| 8 | 1 | Bahía Lumen | 2200 |
| 9 | NULL | Bahía Lumen | 700 |
Puedes escribir aquí mismo: cada ejercicio se ejecuta con DuckDB en tu navegador, sin instalar nada. Con el teclado: Ctrl + Enter.
La ciudad y sus robos, sólo donde hubo más de 2.
Después del GROUP BY: HAVING COUNT(*) > 2
Por ciudad, cuántos robos de 500 o más de botín hubo.
La condición es sobre cada robo, no sobre el grupo: va en un WHERE, antes del GROUP BY.
El sospechoso_id y el botín total de quienes suman 1500 o más.
El total sólo existe después de agrupar: HAVING SUM(botin) >= 1500
Fuera de San Ciro, el sospechoso_id de quienes tienen 2 robos o más y cuántos son.
WHERE ciudad <> 'San Ciro' antes del GROUP BY, y HAVING COUNT(*) >= 2 después.
Lección terminada.
Lección 5: unir tablas con JOIN →