Aprende SQL

El orden de ejecución en SQL

Aunque escribimos las consultas SQL en un orden determinado, el motor de base de datos las ejecuta en un orden diferente. Entender esto es clave para escribir consultas correctas y eficientes.

Lo que escribes
1 SELECT
2 FROM
3 WHERE
4 GROUP BY
5 HAVING
6 ORDER BY
7 LIMIT
Cómo se ejecuta
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT

Orden de escritura vs. orden de ejecución

PasoLo que escribesCuándo se ejecuta
1SELECT
2FROM
3WHERE
4GROUP BY
5HAVING
6ORDER BY
7LIMIT

¿Por qué importa?

El orden de ejecución explica por qué:

  1. No puedes usar alias del SELECT en WHERE: WHERE se ejecuta antes que SELECT.
  2. Puedes usar alias del SELECT en ORDER BY: ORDER BY se ejecuta después de SELECT.
  3. HAVING filtra grupos, no filas: HAVING se ejecuta después de GROUP BY.

Flujo de ejecución

SELECT developer, COUNT(*) AS total    -- 5. Selecciona columnas
FROM videogames                         -- 1. Accede a la tabla
WHERE year > 2000                       -- 2. Filtra filas
GROUP BY developer                      -- 3. Agrupa
HAVING COUNT(*) > 1                     -- 4. Filtra grupos
ORDER BY total DESC                     -- 6. Ordena resultado
LIMIT 5;                                -- 7. Limita filas devueltas

LIMIT siempre se ejecuta al final, después de ordenar. Esto garantiza que obtienes los primeros N resultados ya ordenados.

Errores comunes por el orden de ejecución

Conocer el orden de ejecución te ayuda a evitar errores muy frecuentes:

1. No puedes usar un alias del SELECT en WHERE

-- ❌ Esto da error: 'total' no existe aún cuando se ejecuta WHERE
SELECT developer, COUNT(*) AS total
FROM videogames
WHERE total > 1
GROUP BY developer;

-- ✅ Usa la expresión completa o HAVING
SELECT developer, COUNT(*) AS total
FROM videogames
GROUP BY developer
HAVING COUNT(*) > 1;

WHERE se ejecuta en el paso 2, pero el alias total se define en el paso 5 (SELECT). Por eso no puede encontrarlo.

2. No puedes usar funciones de agregación en WHERE

-- ❌ Esto da error: no se pueden usar agregaciones en WHERE
SELECT developer, COUNT(*) AS total
FROM videogames
WHERE COUNT(*) > 1
GROUP BY developer;

-- ✅ Usa HAVING para filtrar resultados de agregaciones
SELECT developer, COUNT(*) AS total
FROM videogames
GROUP BY developer
HAVING COUNT(*) > 1;

Las funciones como COUNT(), SUM() o AVG() necesitan que los grupos ya estén formados. Como WHERE se ejecuta antes de GROUP BY, no tiene acceso a ellas.

3. SÍ puedes usar alias del SELECT en ORDER BY

-- ✅ Esto funciona perfectamente
SELECT developer, COUNT(*) AS total
FROM videogames
GROUP BY developer
ORDER BY total DESC;

ORDER BY se ejecuta en el paso 6, después de SELECT (paso 5), por lo que sí puede acceder a los alias definidos ahí.

Ponlo en práctica

Usa la tabla videogames para construir consultas complejas que combinen todas las cláusulas aprendidas:

Nombre de la Tabla: videogames
idtitledeveloperyearplaytime_hours
1The Legend of ZeldaNintendo198620
2Super Mario Bros.Nintendo198510
3Final Fantasy VIISquare Enix199740
4The Witcher 3CD Projekt Red2015100
5MinecraftMojang Studios20119999
6Grand Theft Auto VRockstar Games201380
7Dark SoulsFromSoftware201160
8Portal 2Valve20118
9Red Dead Redemption 2Rockstar Games201870
10The Last of UsNaughty Dog201315
11Halo: Combat EvolvedBungie200110
12God of WarSanta Monica Studio201825

Ejercicios