18th Jul 2022 Lectura de 7 minutos Orden de las operaciones SQL Ignacio L. Bisso SQL aprender SQL princípios básicos de SQL Índice Seis operaciones para ordenar: SELECT, FROM, WHERE, GROUP BY, HAVING y ORDER BY Base de datos de los empleados Cambios en el orden de las operaciones al añadir ORDER BY Añadir cláusulas GROUP BY y HAVING a la consulta Añadir una nueva operación: La cláusula JOIN Palabras de cierre 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: 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: 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: 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: 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: 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! Tags: SQL aprender SQL princípios básicos de SQL