Retour à la liste des articles Articles
7 minutes de lecture

Ordre des opérations SQL

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_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Exemple de table DEPARTMENT :

DEPT_NAMEMANAGERBUDGET
ACCOUNTING100300,000
IT 101250,000
SALES 104700,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 EMPLOYEEqui récupère ces données :

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

Ensuite, nous exécutons WHERE DEPARTMENT = 'IT', qui réduit le résultat de la requête à ceci :

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

Enfin, nous appliquons SELECT FIRST_NAME, LAST_NAME, ce qui produit le résultat final de la requête :

FIRST_NAMELAST_NAME
Mary Sexton
AgnesMiller

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 :

SELECT, FROM, et WHERE

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_NAMELAST_NAME
AgnesMiller
Mary Sexton

Ainsi, si nous avons SELECT avec FROM, WHERE, et ORDER BY, l'ordre d'exécution est le suivant :

SELECT avec FROM, WHERE et ORDER BY

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 > 80000
GROUP BY DEPARTMENT
ORDER BY COUNT(*) DESC

De nouveau, nous exécutons d'abord FROM EMPLOYEE qui récupère ces données :

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

Deuxièmement, nous exécutons WHERE SALARY > 80000, qui réduit le résultat à ceci :

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

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 :

DEPARTMENTCOUNT(*)
ACCOUNTING1
IT 2
SALES 1

Enfin, nous appliquons la clause ORDER BY, produisant le résultat final de la requête :

DEPARTMENTCOUNT(*)
IT 2
ACCOUNTING1
SALES 1

L'ordre d'exécution dans cet exemple est :

1-À PARTIR DE 2-OÙ 3-GROUPE PAR 4-SÉLECTIONNER 5-ORDRE PAR

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_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

Deuxièmement, la clause WHERE, excluant les enregistrements SALES, est traitée :

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

Troisièmement, GROUP BY est appliqué, générant les enregistrements suivants :

DEPARTMENTAVG(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:

DEPARTMENTAVG(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 :

1 - DE, 2 - OÙ, 3 - GROUPE PAR, 4 - AVOIR, 5 - SÉLECTIONNER

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_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Deuxièmement, nous appliquons la clause JOIN générant un nouveau résultat intermédiaire combinant les deux tables :

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

Troisièmement, on applique WHERE BUDGET > 275000:

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

Enfin, SELECT EMPLOYEE_ID, LAST_NAME sont exécutés, produisant le résultat final de la requête :

EMPLOYEE_IDLAST_NAME
100Smith
102Yen
104Komer

L'ordre d'exécution dans cet exemple est le suivant :

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

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 :

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

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 !