Unidad 9 – Consultas avanzadas en SQL
Propósito de la unidad
Aplicar técnicas avanzadas de consulta para agrupar, filtrar resultados agregados y utilizar subconsultas para resolver problemas más complejos en bases de datos.
1. GROUP BY – Agrupar datos
- GROUP BY
- Permite agrupar registros que tienen valores en común, generalmente usado con funciones como COUNT, SUM, AVG.
Sintaxis
SELECT columna, función_agregada
FROM tabla
GROUP BY columna;
Ejemplos
-- Contar alumnos por país
SELECT pais, COUNT(*) AS total
FROM alumnos
GROUP BY pais;
-- Sumar edades por país
SELECT pais, SUM(edad) AS suma_edades
FROM alumnos
GROUP BY pais;
Todas las columnas en SELECT deben estar en GROUP BY o ser parte de una función agregada.
2. HAVING – Filtrar grupos
- HAVING
- Permite filtrar resultados después de aplicar GROUP BY.
Diferencia clave
| WHERE | HAVING |
|---|---|
| Filtra filas antes de agrupar | Filtra grupos después de agrupar |
Sintaxis
SELECT columna, función
FROM tabla
GROUP BY columna
HAVING condición;
Ejemplos
-- Países con más de 2 alumnos
SELECT pais, COUNT(*) AS total
FROM alumnos
GROUP BY pais
HAVING COUNT(*) > 2;
-- Suma de edades mayor a 50
SELECT pais, SUM(edad) AS suma
FROM alumnos
GROUP BY pais
HAVING SUM(edad) > 50;
3. Subconsultas simples
- Subconsulta
- Consulta dentro de otra consulta. Se ejecuta primero y su resultado es usado por la consulta principal.
3.1 Subconsulta en WHERE
-- Alumnos con edad mayor al promedio
SELECT nombre, edad
FROM alumnos
WHERE edad > (
SELECT AVG(edad)
FROM alumnos
);
3.2 Subconsulta con IN
-- Alumnos de países con más de 2 registros
SELECT nombre, pais
FROM alumnos
WHERE pais IN (
SELECT pais
FROM alumnos
GROUP BY pais
HAVING COUNT(*) > 2
);
3.3 Subconsulta en SELECT
-- Mostrar nombre y el promedio general
SELECT nombre,
(SELECT AVG(edad) FROM alumnos) AS promedio
FROM alumnos;
Integración de conceptos
SELECT pais, COUNT(*) AS total
FROM alumnos
WHERE edad > 18
GROUP BY pais
HAVING COUNT(*) >= 2
ORDER BY total DESC;
Errores comunes
- Usar columnas en SELECT que no están en GROUP BY ni en funciones agregadas
- Confundir WHERE con HAVING
- Subconsultas que devuelven múltiples valores sin usar IN