Curso
Al escribir consultas SQL, solemos seguir un orden determinado. (Se sabe que SQL se escribe de dentro a fuera). Sin embargo, los motores SQL siguen un orden específico de ejecución al compilar las consultas, que es distinto del orden típico de escritura. Comprender el orden de ejecución de SQL es importante para dominar la optimización de consultas, mejorar la precisión y el rendimiento de las consultas y depurar problemas complejos, como verás.
Para empezar, te recomiendo que sigas el curso Introducción a SQL de DataCamp y el de Fundamentos de SQL para aprender los conceptos básicos de SQL y cómo extraer datos mediante consultas. La Hoja de trucos de conceptos básicos de SQL será una guía útil de las funciones SQL más comunes para filtrar y agregar datos.
¿Qué es el Orden de Ejecución SQL?
El orden de ejecución SQL se refiere al orden en que se evalúan las distintas cláusulas de la consulta. Merece la pena entenderlo porque el orden de ejecución suele ser distinto de cómo escribimos las consultas SQL. Por poner el ejemplo más sencillo, podrías pensar que en el caso de SELECT * FROM database, la cláusula SELECT se evalúa primero, pero en realidad el orden de ejecución comienza con la cláusula FROM.
Este es el orden de ejecución de SQL. En la siguiente sección, veremos los pasos en detalle.
- DESDE/ENTRAR: Especifica las tablas de las que recuperar datos.
- DONDE: Filtra las filas que cumplen la condición antes de agruparlas.
- GRUPO POR: Agrupa las filas que comparten una propiedad.
- TENIENDO: Filtra los grupos en función de las condiciones, aplicadas después de la agrupación.
- SELECCIONA: Especifica las columnas a recuperar o calcular.
- DISTINCT: Elimina las filas duplicadas del conjunto de resultados.
- ORDENADO POR: Ordena el conjunto de resultados por las columnas especificadas.
- LIMIT: Especifica el número máximo de filas a devolver.
- OFFSET: Especifica cuántas filas saltar antes de empezar a devolver filas.
En la siguiente consulta, he añadido comentarios para mostrar cuáles se evalúan primero.
-- #6+7 SELECT DISTINCT department_id
-- #1 FROM employees
-- #2 JOIN orders ON customers.customer_id = orders.customer_id
-- #3 WHERE salary > 3000
-- #4 GROUP BY department
-- #5 HAVING AVG(salary) > 5000
-- #8 ORDER BY department
-- #9 LIMIT 10 OFFSET 5
-- #10 OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
También he creado un acróstico que puede ayudar: Para los Objetivosy Obstáculos del Trabajo Busca enlas Oportunidades de Aprendizaje Organizadode DataCamp.
Etapas de la ejecución de una consulta SQL
Aunque la mayoría de las consultas SQL que escribimos empiezan por la sentencia SELECT, el orden lógico de ejecución comienza por la cláusula FROM. Aquí escribiré consultas para mostrar el orden de ejecución de las consultas . Aunque, ten en cuenta que estas consultas son incompletas y no se compilarán.
Cláusula FROM
Las consultas SQL comienzan el proceso de ejecución con la cláusula FROM. Suele ser la primera etapa, ya que la base de datos identifica las fuentes/tablas de datos. Cuando estén implicadas varias tablas, la consulta SQL también evaluará la condición JOIN para combinar las tablas especificadas como fuente de datos.
La consulta incompleta que se muestra a continuación seleccionaría primero los datos de la tabla customers mediante la cláusula FROM y de la tabla orders mediante la cláusula JOIN.
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id;
Cláusula WHERE
La cláusula WHERE se ejecuta después de las cláusulas FROM y JOIN para filtrar las filas basándose en condiciones específicas. Es importante tener en cuenta que las columnas definidas con alias en la cláusula SELECT no pueden referenciarse directamente en la cláusula WHERE, ya que ésta se procesa antes que la SELECT.
La siguiente consulta utiliza la cláusula WHERE para filtrar los registros de empleados con una bonus superior a 5000.
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary * 0.1 > 5000;
Como bonus tiene un alias en la declaración SELECT, utilizarlo en la cláusula WHERE provocará un error. En su lugar, debes repetir la expresión completa salary * 0.1 en la cláusula WHERE.
Cláusula GROUP BY
Tras filtrar las filas, SQL ejecuta la cláusula GROUP BY para agrupar los resultados en función de las columnas especificadas. Este paso se suele utilizar con funciones agregadas como COUNT(), SUM(), y AVG() para realizar algunos cálculos en las columnas especificadas.
La siguiente consulta filtra primero los empleados con un salary superior a 3,000, luego los agrupa por department y calcula el salario medio de cada grupo.
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department;
Cláusula HAVING
La cláusula HAVING es similar a la cláusula WHERE, pero se utiliza para filtrar datos agrupados después de la operación GROUP BY. En la siguiente consulta, SQL agrupa employees por department, calcula el salario medio de cada grupo y, a continuación, filtra los grupos en los que el salario medio es inferior o igual a 5,000.
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;
La consulta anterior no puede utilizar la cláusula WHERE porque no funciona con resultados agregados.
Cláusula SELECT
La cláusula SELECT es donde SQL obtiene las columnas o expresiones que se devolverán tras ejecutar los pasos anteriores. Puedes aplicar operaciones aritméticas, alias y funciones agregadas en la cláusula SELECT.
La siguiente consulta utiliza la cláusula SELECT para recuperar los datos name y bonus calculados como salary * 0.1 de la tabla employees.
SELECT department, AVG(salary)
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;
Cláusula DISTINCT
La cláusula DISTINCT se evalúa después de la cláusula SELECT en una consulta. La cláusula DISTINCT es importante para eliminar registros duplicados de una tabla porque devuelve filas únicas. La siguiente consulta devuelve cada department_id único, filtrando los duplicados.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;
Cláusula ORDER BY
La cláusula ORDER BY ordena el conjunto de resultados de determinadas columnas o expresiones. A diferencia de la cláusula WHERE, la cláusula ORDER BY puede utilizar alias de columnas definidos en la sentencia SELECT.
La consulta siguiente ordena la columna bonus en orden descendente. Ten en cuenta que bonus se definió en la declaración SELECT como alias de una expresión.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;
ORDER BY bonus DESC;
Cláusula LIMIT/OFFSET
Las cláusulas LIMIT y OFFSET suelen ser las últimas en ejecutarse en una consulta SQL para restringir el número de filas a devolver. La cláusula LIMIT especifica el número máximo de filas a devolver, y OFFSET especifica cuántas filas saltar antes de empezar a devolver filas.
La consulta siguiente recupera los nombres y salarios de los empleados, los ordena por salary en orden descendente, y limita la salida a 10 resultados saltándose las 5 primeras filas.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC
LIMIT 10 OFFSET 5
-- OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; --SQL SERVER / ORACLE
Las cláusulas LIMIT y OFFSET son compatibles con las bases de datos MySQL y PostgreSQL. En SQL Server y Oracle, puedes utilizar OFFSET, ROWS FETCH, y ROWS ONLY para restringir el número de filas que devuelve una consulta.
Consulta nuestro tutorial sobre Cómo utilizar OFFSET en SQL para obtener más información sobre la paginación de datos y la compatibilidad específica de las bases de datos con las cláusulas OFFSET y LIMIT.
Orden de ejecución SQL vs. Orden de escritura
SQL es un lenguaje declarativo, lo que significa que el orden de ejecución de las consultas difiere del orden escrito. Así, en lugar de especificar cómo realizar una tarea, declaras lo que quieres, y el motor de la base de datos decide la mejor forma de conseguirlo. Este método difiere de los lenguajes de programación imperativos como Python o Java, en los que escribes explícitamente instrucciones paso a paso para su ejecución.
Comprender el orden de ejecución de SQL cambia tu forma de pensar sobre la construcción de consultas. Por ejemplo, imagina que escribes una consulta para filtrar filas basándote en un alias que has creado en la cláusula SELECT:
SELECT price * 0.9 AS discounted_price
FROM products
WHERE discounted_price > 100;
A primera vista, esto parece lógico, pero arrojará un error. ¿Por qué? Porque la cláusula WHERE se evalúa antes que la cláusula SELECT en el orden de ejecución de SQL. Para solucionarlo, tendrías que utilizar una subconsulta o HAVING en su lugar:
SELECT price * 0.9 AS discounted_price
FROM products
HAVING discounted_price > 100;
Para saber más sobre WHERE y HAVING en concreto, lee nuestro tutorial: La diferencia entre WHERE y HAVING en SQL.
Errores comunes y buenas prácticas
Aunque el orden de ejecución de la consulta no se ve afectado por el orden de escritura, comprender el flujo de ejecución es crucial para evitar errores comunes y mejorar el rendimiento de la consulta. Los siguientes errores están directamente relacionados con la incomprensión del orden de ejecución de SQL:
Errores comunes
A continuación se indican los errores más comunes que pueden entorpecer el rendimiento de tu consulta.
-
Utilizar alias de columna en la cláusula WHERE: La cláusula
WHEREse ejecuta antes que la cláusulaSELECT, por lo que se producirá un error si utilizas un alias en la cláusulaWHERE. Para evitar este error, utiliza siempre la expresión original en lugar de un alias en la cláusulaWHERE. -
Uso de alias de columna en la cláusula WHERE: Como la cláusula
WHEREse ejecuta antes que la cláusulaSELECT, intentar utilizar un alias enWHEREdará lugar a un error. Comprender que SQL evalúaWHEREantes de la cláusulaSELECTte enseña que debes repetir la expresión completa en lugar de confiar en un alias. -
Utilizar HAVING para filtrar filas en lugar de WHERE: La cláusula
HAVINGse ejecuta después deGROUP BYy está pensada para filtrar datos agregados. Si estás filtrando datos no agregados, pertenece a la cláusula WHERE. Conocer la diferencia en el orden de ejecución entre WHERE y HAVING te ayuda a determinar dónde debe colocarse cada condición. -
Uso incorrecto de agregados en SELECT sin GROUP BY: Puesto que
GROUP BYse ejecuta antes queHAVINGoSELECT, si no agrupas tus datos antes de aplicar una función de agregado, se producirán resultados incorrectos o errores. Comprender el orden de ejecución aclara por qué estas dos cláusulas deben ir juntas. -
No utilizar correctamente los alias en la cláusula ORDER BY: A diferencia de la cláusula
WHERE, la cláusulaORDER BYse evalúa después deSELECT. Esto te permite utilizar los alias creados enSELECTpara la clasificación, ayudándote a evitar confusiones al saber cuándo están disponibles los alias para su uso.
Buenas prácticas
Ten en cuenta las siguientes buenas prácticas para asegurarte de que tus consultas se ejecutan como esperas.
-
Filtra antes con WHERE: Como la cláusula
WHEREse ejecuta antes queGROUP BYyJOIN, aplicar los filtros antes reduce el número de filas procesadas por las cláusulas posteriores, lo que mejora el rendimiento de la consulta. Al filtrar los datos no agrupados lo antes posible, limitas los datos que hay que agrupar o unir, ahorrando tiempo de procesamiento. -
Preagregar datos antes de unirlos: Sabiendo que
FROMyJOINson las primeras cláusulas que se ejecutan, preagrupar los datos mediante subconsultas o expresiones comunes de tabla (CTE) te permite reducir el conjunto de datos antes del proceso de unión. Esto garantiza que se procesen menos filas durante la unión. -
Optimizar ORDER BY con índices: Puesto que la cláusula
ORDER BYes uno de los últimos pasos ejecutados, asegurarse de que las columnas ordenadas están indexadas acelerará el rendimiento de la consulta al ayudar a la base de datos a gestionar las operaciones de ordenación con mayor eficacia. -
Evita SELECT * en las consultas de producción: La cláusula
SELECTse ejecuta después de filtrar, agrupar y agregar, por lo que especificar sólo las columnas necesarias minimiza la cantidad de datos recuperados, reduciendo la sobrecarga innecesaria.
Conclusión
Comprender el orden de ejecución de SQL es importante para escribir consultas eficaces, precisas y optimizadas. Hemos hablado del orden lógico de ejecución de las consultas en SQL y lo hemos comparado con el orden escrito. Te animo a que practiques escribiendo diferentes consultas para comprender mejor el orden lógico de ejecución. Dominar este concepto mejorará enormemente tu capacidad para solucionar problemas y optimizar las consultas SQL.
Si quieres mejorar tus conocimientos de SQL, te recomiendo que pruebes el itinerario profesional de Analista de Datos Asociado en SQL de DataCamp para convertirte en un analista de datos competente. El curso de Informes en SQL también te ayudará a dominar la creación de informes y cuadros de mando complejos para una presentación eficaz de los datos. Por último, deberías obtener la Certificación de Asociado SQL para demostrar tu dominio en el uso de SQL para resolver problemas empresariales y destacar entre otros profesionales.
Conviértete en Ingeniero de Datos
Preguntas frecuentes sobre el orden de ejecución de SQL
¿En qué se diferencia la ejecución SQL de la orden escrita?
El orden de ejecución de SQL suele comenzar con la cláusula FROM, seguida de cláusulas como WHERE y GROUP BY, mientras que el orden de escritura comienza con la sentencia SELECT.
¿Cómo encaja JOIN en el orden de ejecución?
Las operaciones JOIN se ejecutan como parte de la cláusula FROM.
¿Puedo utilizar alias de columnas en la cláusula WHERE?
No, los alias de columna se definen en la cláusula SELECT, que se ejecuta después de la cláusula WHERE.
¿Cuál es la diferencia entre DONDE y TENER?
WHERE filtra las filas antes de agruparlas, mientras que HAVING filtra después de GROUP BY y funciona con datos agregados.
¿Influye el orden de ejecución de SQL en el rendimiento de las consultas?
Sí, comprender el orden de ejecución te permite optimizar las consultas aplicando filtros antes y reduciendo las operaciones innecesarias.

