SQL n'est pas un langage de programmation traditionnel dans lequel vous écrivez une séquence d'instructions dans un ordre d'exécution donné. Au lieu de cela, SQL est un langage "déclaratif", ce qui signifie qu'en écrivant une requête SQL, vous déclarez quelles données vous attendez comme résultat de la requête, mais vous n'indiquez pas comment les obtenir.
Six opérations à ordonner : SELECT, FROM, WHERE, GROUP BY, HAVING et ORDER BY
À l'aide d'exemples, nous allons expliquer l'ordre d'exécution des six opérations ou éléments les plus courants d'une requête SQL. Comme la base de données exécute les composants de la requête dans un ordre spécifique, il est utile pour le développeur de connaître cet ordre. C'est un peu comme suivre une recette : vous devez connaître les ingrédients et ce qu'il faut faire avec les ingrédients, mais vous devez aussi savoir dans quel ordre effectuer les tâches. Si la base de données suit un ordre d'opérations différent, les performances de la requête peuvent diminuer considérablement.
La meilleure façon d'apprendre l'ordre des opérations SQL est de s'exercer. Je recommande la piste de LearnSQL.fr La pratique du SQL de LearnSQL.fr. Il contient plus de 600 exercices pratiques pour mettre en pratique vos compétences en SQL. Vous pouvez également choisir le cours qui vous convient le mieux parmi plus de 30 cours SQL interactifs que nous proposons à différents niveaux de compétence.
La base de données des employés
Dans cet article, nous allons travailler avec la base de données d'une entreprise typique dont les employés sont répartis dans différents départements. Chaque employé a un ID, un nom, un salaire et appartient à un département, comme nous pouvons le voir dans les tables suivantes.
Exemple de table EMPLOYEE
:
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 |
Exemple de table DEPARTMENT
:
DEPT_NAME | MANAGER | BUDGET |
---|---|---|
ACCOUNTING | 100 | 300,000 |
IT | 101 | 250,000 |
SALES | 104 | 700,000 |
Dans cet article, nous utiliserons également des requêtes SQL fréquemment utilisées dans une entreprise : "Obtenir les noms des employés travaillant pour le département informatique" ou "Obtenir le nombre d'employés de chaque département dont le salaire est supérieur à 80.000". Pour chacune de ces requêtes, nous allons analyser l'ordre d'exécution de ses composants.
Commençons par une requête simple pour obtenir les noms des employés du département informatique :
SELECT LAST_NAME, FIRST_NAME FROM EMPLOYEE WHERE DEPARTMENT = 'IT'
Tout d'abord, nous exécutons FROM EMPLOYEE
qui récupère ces données :
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 |
Ensuite, nous exécutons WHERE DEPARTMENT = 'IT'
, qui réduit le résultat de la requête à ceci :
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT |
---|---|---|---|---|
101 | Mary | Sexton | 82,000 | IT |
103 | Agnes | Miller | 95,000 | IT |
Enfin, nous appliquons SELECT FIRST_NAME, LAST_NAME
, ce qui produit le résultat final de la requête :
FIRST_NAME | LAST_NAME |
---|---|
Mary | Sexton |
Agnes | Miller |
Super ! Après avoir terminé notre première dissection de requête, nous pouvons conclure que l'ordre d'exécution des requêtes simples avec SELECT
, FROM
, et WHERE
est le suivant :
Changements dans l'ordre des opérations si nous ajoutons ORDER BY
Supposons que votre patron reçoive un rapport basé sur la requête de l'exemple précédent et le rejette, car les noms des employés ne sont pas dans l'ordre alphabétique. Pour résoudre ce problème, vous devez ajouter une clause ORDER BY
à la requête précédente :
SELECT LAST_NAME, FIRST_NAME FROM EMPLOYEE WHERE DEPARTMENT = 'IT'ORDER BY FIRST_NAME
Le processus d'exécution de cette requête est presque le même, que dans l'exemple précédent. Le seul changement se situe à la fin, lorsque la clause ORDER BY
est traitée. Le résultat final de cette requête ordonne les entrées par FIRST_NAME
, comme indiqué ci-dessous :
FIRST_NAME | LAST_NAME |
---|---|
Agnes | Miller |
Mary | Sexton |
Ainsi, si nous avons SELECT
avec FROM
, WHERE
, et ORDER BY
, l'ordre d'exécution est le suivant :
Ajout de clauses GROUP BY et HAVING à la requête
Dans cet exemple, nous allons utiliser une requête avec GROUP BY
. Supposons que nous voulions obtenir le nombre d'employés de chaque département qui ont un salaire supérieur à 80 000, et que nous voulions le résultat dans l'ordre décroissant du nombre de personnes dans chaque département. La requête pour cette situation est la suivante :
SELECT DEPARTMENT, COUNT(*) FROM EMPLOYEES WHERE SALARY > 80000GROUP BY DEPARTMENTORDER BY COUNT(*) DESC
De nouveau, nous exécutons d'abord FROM EMPLOYEE
qui récupère ces données :
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 |
Deuxièmement, nous exécutons WHERE SALARY > 80000
, qui réduit le résultat à ceci :
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 |
Troisièmement, GROUP BY
est appliqué, générant un enregistrement pour chaque valeur distincte dans les colonnes de GROUP BY
. Dans notre exemple, nous créons un enregistrement pour chaque valeur distincte dans DEPARTMENT
:
DEPARTMENT |
---|
ACCOUNTING |
IT |
SALES |
Quatrièmement, nous appliquons SELECT
avec COUNT(*)
, produisant ce résultat intermédiaire :
DEPARTMENT | COUNT(*) |
---|---|
ACCOUNTING | 1 |
IT | 2 |
SALES | 1 |
Enfin, nous appliquons la clause ORDER BY
, produisant le résultat final de la requête :
DEPARTMENT | COUNT(*) |
---|---|
IT | 2 |
ACCOUNTING | 1 |
SALES | 1 |
L'ordre d'exécution dans cet exemple est :
Dans le prochain exemple, nous allons ajouter la clause HAVING
. HAVING
n'est pas aussi couramment utilisée en SQL que les autres clauses que nous avons examinées jusqu'à présent. La meilleure façon de décrire HAVING
est de dire que c'est comme la clause WHERE
pour GROUP BY
. En d'autres termes, c'est un moyen de filtrer ou d'écarter certains des groupes d'enregistrements créés par GROUP BY
.
Supposons maintenant que nous voulions obtenir tous les départements, sauf le département SALES
, dont le salaire moyen est supérieur à 80 000. La requête pour cette situation est la suivante :
SELECT DEPARTMENT FROM EMPLOYEES WHERE DEPARTMENT <> 'SALES'GROUP BY DEPARTMENT HAVING AVG(SALARY) > 80000
Encore une fois, nous exécutons d'abord FROM EMPLOYEE
qui récupère ces données :
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 |
Deuxièmement, la clause WHERE
, excluant les enregistrements SALES
, est traitée :
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 |
Troisièmement, GROUP BY est appliqué, générant les enregistrements suivants :
DEPARTMENT | AVG(SALARY) |
---|---|
ACCOUNTING | 79,250 |
IT | 88,500 |
Quatrièmement, HAVING AVG(SALARY) > 80000
est appliqué pour filtrer le groupe d'enregistrements générés par GROUP BY
:
DEPARTMENT | AVG(SALARY) |
---|---|
IT | 88,500 |
Enfin, la clause SELECT
est appliquée, produisant le résultat final de la requête :
DEPARTMENT |
---|
IT |
L'ordre d'exécution dans cet exemple est le suivant :
Ajout d'une nouvelle opération : la clause JOIN
Les exemples précédents portaient sur une seule table. Ajoutons une deuxième table à l'aide de la clause JOIN
. Supposons que nous voulions obtenir les noms de famille et les identifiants des employés travaillant pour des départements dont le budget est supérieur à 275 000. La requête pour cette situation est la suivante :
SELECT EMPLOYEE_ID, LAST_NAME FROM EMPLOYEES JOIN DEPARTMENT ON DEPARTMENT = DEPT_NAME WHERE BUDGET > 275000
Encore une fois, nous exécutons d'abord FROM EMPLOYEE
qui récupère ces données :
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 |
Deuxièmement, nous appliquons la clause JOIN générant un nouveau résultat intermédiaire combinant les deux tables :
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 |
Troisièmement, on applique 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 |
Enfin, SELECT EMPLOYEE_ID, LAST_NAME
sont exécutés, produisant le résultat final de la requête :
EMPLOYEE_ID | LAST_NAME |
---|---|
100 | Smith |
102 | Yen |
104 | Komer |
L'ordre d'exécution dans cet exemple est le suivant :
Mot de la fin
Dans cet article, nous avons couvert l'ordre d'exécution dans les requêtes SQL à travers des exemples. Ces exemples montrent qu'il existe un ordre d'exécution, mais que cet ordre peut varier en fonction des clauses présentes dans la requête. En règle générale, l'ordre d'exécution est le suivant :
Cependant, si l'une de ces clauses n'est pas présente, l'ordre d'exécution sera différent. SQL est un langage d'abord facile, mais une fois que vous avez commencé, il y a beaucoup de concepts passionnants à explorer. Consultez ce cours en ligne pour entrer dans le monde fascinant de SQL et voir où il peut vous mener !