Volver a la lista de artículos Artículos
Lectura de 7 minutos

Orden de las operaciones SQL

SQL no es un lenguaje de programación tradicional en el que una secuencia de instrucciones se escribe en un orden de ejecución determinado. SQL es un lenguaje "declarativo", lo que significa que al escribir una consulta SQL, se declara qué datos espera como resultado de la consulta, pero no indica cómo obtenerlos.

Seis operaciones para ordenar: SELECT, FROM, WHERE, GROUP BY, HAVING y ORDER BY

Mediante el uso de ejemplos, explicaremos el orden de ejecución de las seis operaciones o piezas más comunes en una consulta SQL. Dado que la base de datos ejecuta los componentes de la consulta en un orden específico, para la persona a cargo del desarrollo resulta útil conocer este orden. Es parecido a seguir una receta: hay que conocer los ingredientes y lo que hay que hacer con los ingredientes, pero también hay que saber en qué orden se hacen las tareas. Si la base de datos sigue un orden de operaciones diferente, el rendimiento de la consulta puede disminuir drásticamente.

La mejor manera de aprender el orden de las operaciones SQL es mediante la práctica. Recomiendo visitar Ejercicio de SQL de LearnSQL.es. Contiene más de 600 ejercicios para practicar tus conocimientos de SQL. También, puedes seleccionar allí el mejor curso para ti entre los más de 30 cursos interactivos de SQL que ofrecemos para varios niveles de competencia.

Base de datos de los empleados

En este artículo, trabajaremos con una base de datos para una empresa típica que tiene empleados distribuidos en diferentes departamentos. Cada empleado tiene un ID, un nombre y un salario, y pertenece a un departamento, como podemos ver en las siguientes tablas.

Muestra de la tabla EMPLOYEE (empleado):

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Muestra de la tabla DEPARTMENT (departamento):

DEPT_NAMEMANAGERBUDGET
ACCOUNTING100300,000
IT 101250,000
SALES 104700,000

En este artículo también utilizaremos consultas SQL que son frecuentes en una empresa: "Obtener los nombres de los empleados que trabajan en el departamento de informática" u "Obtener el número de empleados de cada departamento con un salario superior a $80.000". Para cada una de estas consultas, analizaremos el orden de ejecución de sus componentes.

Empecemos con una consulta sencilla para obtener los nombres de los empleados del departamento de informática:

SELECT LAST_NAME, FIRST_NAME
  FROM EMPLOYEE
 WHERE DEPARTMENT = 'IT'

Primero, ejecutamos FROM EMPLOYEEque recupera estos datos:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

En segundo lugar, ejecutamos WHERE DEPARTMENT = 'IT', que lo reduce a esto:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
101Mary Sexton82,000IT
103AgnesMiller95,000IT

Por último, aplicamos SELECT FIRST_NAME, LAST_NAME, produciendo el resultado final de la consulta:

FIRST_NAMELAST_NAME
Mary Sexton
AgnesMiller

¡Genial! Después de completar nuestra primera disección de la consulta, podemos concluir que el orden de ejecución para las consultas simples con SELECT, FROM y WHERE es:

SELECT, FROM y WHERE

Cambios en el orden de las operaciones al añadir ORDER BY

Supongamos que tu jefe recibe un informe basado en la consulta del ejemplo anterior y lo rechaza porque los nombres de los empleados no están en orden alfabético. Para solucionarlo, hay que añadir una cláusula ORDER BY a la consulta anterior:

  SELECT LAST_NAME, FIRST_NAME
    FROM EMPLOYEE
   WHERE DEPARTMENT = 'IT'
ORDER BY FIRST_NAME

El proceso de ejecución de esta consulta es prácticamente el mismo que en el ejemplo anterior. El único cambio está al final, cuando se procesa la cláusula ORDER BY. El resultado final de esta consulta ordena las entradas por FIRST_NAME, como se muestra a continuación:

FIRST_NAMELAST_NAME
AgnesMiller
Mary Sexton

Así, si tenemos SELECT con FROM, WHERE y ORDER BY, el orden de ejecución es:

SELECT con FROM, WHERE y ORDER BY

Añadir cláusulas GROUP BY y HAVING a la consulta

En este ejemplo, utilizaremos una consulta con GROUP BY. Supongamos que queremos obtener cuántos empleados de cada departamento tienen un sueldo superior a $80.000, y queremos el resultado en orden descendente por el número de personas de cada departamento. La consulta para esta situación es:

  SELECT DEPARTMENT, COUNT(*)
    FROM EMPLOYEES
   WHERE SALARY > 80000
GROUP BY DEPARTMENT
ORDER BY COUNT(*) DESC

Nuevamente, ejecutamos primero FROM EMPLOYEEque recupera estos datos:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

En segundo lugar, ejecutamos WHERE SALARY > 80000, que reduce el resultado a esto:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

En tercer lugar, se aplica GROUP BY, generando un registro por cada valor distinto en las columnas de GROUP BY. En nuestro ejemplo, creamos un registro por cada valor distinto en DEPARTMENT:

DEPARTMENT
ACCOUNTING
IT
SALES

En cuarto lugar, aplicamos SELECT con COUNT(*), produciendo este resultado intermedio:

DEPARTMENTCOUNT(*)
ACCOUNTING1
IT 2
SALES 1

Finalmente, aplicamos la cláusula ORDER BY, produciendo el resultado final de la consulta:

DEPARTMENTCOUNT(*)
IT 2
ACCOUNTING1
SALES 1

El orden de ejecución en este ejemplo es:

1-FROM 2-WHERE 3-GROUP BY 4-SELECT 5-ORDER BY

En el siguiente ejemplo, añadiremos la cláusula HAVING. HAVING no se suele utilizar tanto como las otras cláusulas que hemos visto hasta ahora. La mejor manera de describir HAVING es que es como la cláusula WHERE para GROUP BY. En otras palabras, es una forma de filtrar o descartar algunos de los grupos de registros creados por GROUP BY.

Supongamos que ahora queremos obtener todos los departamentos, excepto el departamento SALES, con un salario medio superior a $80.000. La consulta para esta situación es:

  SELECT DEPARTMENT
    FROM EMPLOYEES
   WHERE DEPARTMENT <> 'SALES'
GROUP BY DEPARTMENT
  HAVING AVG(SALARY) > 80000

Nuevamente, ejecutamos primero FROM EMPLOYEEque recupera estos datos:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100 James Smith 78,000 ACCOUNTING
101 Mary Sexton 82,000 IT
102 Chun Yen 80,500 ACCOUNTING
103 Agnes Miller 95,000 IT
104 Dmitry Komer 120,000 SALES

Segundo, se procesa la cláusula WHERE, excluyendo los registros de SALES:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100 James Smith 78,000 ACCOUNTING
101 Mary Sexton 82,000 IT
102 Chun Yen 80,500 ACCOUNTING
103 Agnes Miller 95,000 IT

Tercero, se aplica GROUP BY, generando los siguientes registros:

DEPARTMENTAVG(SALARY)
ACCOUNTING 79,250
IT 88,500

Cuarto, se aplica HAVING AVG(SALARY) > 80000 para filtrar el grupo de registros generados por GROUP BY:

DEPARTMENTAVG(SALARY)
IT 88,500

Por último, se aplica la cláusula SELECT, produciendo el resultado final de la consulta:

DEPARTMENT
IT

El orden de ejecución en este ejemplo es:

1 - FROM, 2 - WHERE, 3 - GROUP BY, 4 - HAVING, 5 - SELECT

Añadir una nueva operación: La cláusula JOIN

Los ejemplos anteriores se refieren a una sola tabla. Vamos a añadir una segunda tabla utilizando la cláusula JOIN. Supongamos que queremos obtener los apellidos y los ID de los empleados que trabajan en departamentos con un presupuesto superior a $275.000. La consulta para esta situación es:

SELECT EMPLOYEE_ID, LAST_NAME
  FROM EMPLOYEES
  JOIN DEPARTMENT
    ON DEPARTMENT = DEPT_NAME
 WHERE BUDGET > 275000

Nuevamente, ejecutamos primero FROM EMPLOYEEque recupera estos datos:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

En segundo lugar, aplicamos la cláusula JOIN generando un nuevo resultado intermedio que combina ambas tablas:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENTDEPT_NAMEMANAGERBUDGET
100James Smith 78,000 ACCOUNTINGACCOUNTING100300,000
101Mary Sexton82,000 IT IT 101250,000
102Chun Yen 80,500 ACCOUNTINGACCOUNTING100300,000
103Agnes Miller95,000 IT IT 101250,000
104DmitryKomer 120,000SALES SALES 104700,000

En tercer lugar, se aplica WHERE BUDGET > 275000:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENTDEPT_NAMEMANAGERBUDGET
100James Smith78,000 ACCOUNTINGACCOUNTING100300,000
102Chun Yen 80,500 ACCOUNTINGACCOUNTING100300,000
104DmitryKomer120,000SALES SALES 104700,000

Por último, se ejecuta SELECT EMPLOYEE_ID, LAST_NAME, produciendo el resultado final de la consulta:

EMPLOYEE_IDLAST_NAME
100Smith
102Yen
104Komer

El orden de ejecución en este ejemplo es:

1 - FROM, 2 - JOIN, 3 - WHERE, 4 - SELECT

Palabras de cierre

En este artículo, hemos cubierto el orden de ejecución en las consultas SQL a través de ejemplos. Gracias a estos ejemplos, podemos ver que existe un orden de ejecución, pero este orden puede variar dependiendo de las cláusulas que estén presentes en la consulta. Como pauta general, el orden de ejecución es:

1 - FROM, 2 - JOIN, 3 - WHERE, 4 - GROUP BY, 5 - HAVING, 6 - SELECT, 7 - ORDER BY

Sin embargo, si una de estas cláusulas no está presente, el orden de ejecución será diferente. SQL es un lenguaje sencillo, pero una vez que estás dentro, verás que hay muchísimos conceptos interesantes para explorar. Consulta este curso en línea para adentrarte en el fascinante mundo de SQL, ¡y descubre a dónde te puede llevar!