Saltar al contenido principal

Orden de ejecución SQL: Entender cómo se ejecutan las consultas

Comprende el orden de ejecución de SQL y en qué se diferencia del orden de escritura. Escribe consultas precisas y optimizadas para mejorar el rendimiento y evitar errores comunes en el diseño de consultas.
Actualizado 10 oct 2024  · 5 min de lectura

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 WHERE se ejecuta antes que la cláusula SELECT, por lo que se producirá un error si utilizas un alias en la cláusula WHERE. Para evitar este error, utiliza siempre la expresión original en lugar de un alias en la cláusula WHERE.

  • Uso de alias de columna en la cláusula WHERE: Como la cláusula WHERE se ejecuta antes que la cláusula SELECT, intentar utilizar un alias en WHERE dará lugar a un error. Comprender que SQL evalúa WHERE antes de la cláusula SELECT te 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 HAVING se ejecuta después de GROUP BY y 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 BY se ejecuta antes que HAVING o SELECT, 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áusula ORDER BY se evalúa después de SELECT. Esto te permite utilizar los alias creados en SELECT para 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 WHERE se ejecuta antes que GROUP BY y JOIN, 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 FROM y JOIN son 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 BY es 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 SELECT se 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

Desarrolla tus habilidades en Python para convertirte en un ingeniero de datos profesional.
Empieza gratis

Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Creo artículos que simplifican la ciencia de los datos y la analítica, haciéndolos fáciles de entender y accesibles.

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.

Temas

Aprende SQL con DataCamp

curso

Introduction to SQL

2 hr
838.8K
Learn how to create and query relational databases using SQL in just two hours.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

Las 80 mejores preguntas y respuestas de entrevistas SQL para principiantes y profesionales intermedios

Este artículo ofrece una visión completa de 80 preguntas y respuestas esenciales sobre SQL para los que buscan trabajo, los directores de RR. HH. y los reclutadores, y abarca tanto temas generales como preguntas técnicas.
Elena Kosourova's photo

Elena Kosourova

12 min

tutorial

Ejemplos y tutoriales de consultas SQL

Si quiere iniciarse en SQL, nosotros le ayudamos. En este tutorial de SQL, le presentaremos las consultas SQL, una potente herramienta que nos permite trabajar con los datos almacenados en una base de datos. Verá cómo escribir consultas SQL, aprenderá sobre
Sejal Jaiswal's photo

Sejal Jaiswal

21 min

tutorial

Cómo utilizar un alias SQL para simplificar tus consultas

Explora cómo el uso de un alias SQL simplifica tanto los nombres de las columnas como los de las tablas. Aprende por qué utilizar un alias SQL es clave para mejorar la legibilidad y gestionar uniones complejas.
Allan Ouko's photo

Allan Ouko

9 min

tutorial

Introducción a los disparadores SQL: Guía para desarrolladores

Aprende a utilizar los disparadores SQL para automatizar tareas, mantener la integridad de los datos y mejorar el rendimiento de la base de datos. Prueba ejemplos prácticos como los comandos CREATE, ALTER y DROP en MySQL y Oracle.
Oluseye Jeremiah's photo

Oluseye Jeremiah

13 min

tutorial

Tutorial sobre cómo ejecutar consultas SQL en Python y R

Aprenda formas fáciles y eficaces de ejecutar consultas SQL en Python y R para el análisis de datos y la gestión de bases de datos.
Abid Ali Awan's photo

Abid Ali Awan

13 min

tutorial

Seleccionar varias columnas en SQL

Aprende a seleccionar fácilmente varias columnas de una tabla de base de datos en SQL, o a seleccionar todas las columnas de una tabla en una simple consulta.
DataCamp Team's photo

DataCamp Team

3 min

See MoreSee More