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_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
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 |
Muestra de la tabla DEPARTMENT
(departamento):
DEPT_NAME | MANAGER | BUDGET |
---|---|---|
ACCOUNTING | 100 | 300,000 |
IT | 101 | 250,000 |
SALES | 104 | 700,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 EMPLOYEE
que recupera estos datos:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
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 |
En segundo lugar, ejecutamos WHERE DEPARTMENT = 'IT'
, que lo reduce a esto:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
101 | Mary | Sexton | 82,000 | IT |
103 | Agnes | Miller | 95,000 | IT |
Por último, aplicamos SELECT FIRST_NAME, LAST_NAME
, produciendo el resultado final de la consulta:
FIRST_NAME | LAST_NAME |
---|---|
Mary | Sexton |
Agnes | Miller |
¡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:
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_NAME | LAST_NAME |
---|---|
Agnes | Miller |
Mary | Sexton |
Así, si tenemos SELECT
con FROM
, WHERE
y ORDER BY
, el orden de ejecución es:
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 EMPLOYEE
que recupera estos datos:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
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 |
En segundo lugar, ejecutamos WHERE SALARY > 80000
, que reduce el resultado a esto:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
101 | Mary | Sexton | 82,000 | IT |
102 | Chun | Yen | 80,500 | ACCOUNTING |
103 | Agnes | Miller | 95,000 | IT |
104 | Dmitry | Komer | 120,000 | SALES |
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:
DEPARTMENT | COUNT(*) |
---|---|
ACCOUNTING | 1 |
IT | 2 |
SALES | 1 |
Finalmente, aplicamos la cláusula ORDER BY
, produciendo el resultado final de la consulta:
DEPARTMENT | COUNT(*) |
---|---|
IT | 2 |
ACCOUNTING | 1 |
SALES | 1 |
El orden de ejecución en este ejemplo es:
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 EMPLOYEE
que recupera estos datos:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
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_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
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:
DEPARTMENT | AVG(SALARY) |
---|---|
ACCOUNTING | 79,250 |
IT | 88,500 |
Cuarto, se aplica HAVING AVG(SALARY) > 80000
para filtrar el grupo de registros generados por GROUP BY
:
DEPARTMENT | AVG(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:
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 EMPLOYEE
que recupera estos datos:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
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 |
En segundo lugar, aplicamos la cláusula JOIN generando un nuevo resultado intermedio que combina ambas tablas:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT | DEPT_NAME | MANAGER | BUDGET |
---|---|---|---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING | ACCOUNTING | 100 | 300,000 |
101 | Mary | Sexton | 82,000 | IT | IT | 101 | 250,000 |
102 | Chun | Yen | 80,500 | ACCOUNTING | ACCOUNTING | 100 | 300,000 |
103 | Agnes | Miller | 95,000 | IT | IT | 101 | 250,000 |
104 | Dmitry | Komer | 120,000 | SALES | SALES | 104 | 700,000 |
En tercer lugar, se aplica WHERE BUDGET > 275000
:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT | DEPT_NAME | MANAGER | BUDGET |
---|---|---|---|---|---|---|---|
100 | James | Smith | 78,000 | ACCOUNTING | ACCOUNTING | 100 | 300,000 |
102 | Chun | Yen | 80,500 | ACCOUNTING | ACCOUNTING | 100 | 300,000 |
104 | Dmitry | Komer | 120,000 | SALES | SALES | 104 | 700,000 |
Por último, se ejecuta SELECT EMPLOYEE_ID, LAST_NAME
, produciendo el resultado final de la consulta:
EMPLOYEE_ID | LAST_NAME |
---|---|
100 | Smith |
102 | Yen |
104 | Komer |
El orden de ejecución en este ejemplo es:
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:
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!