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