Ordre d’exécution SQL — écriture vs moteur
On écrit la requête SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT, mais le moteur l’exécute dans un ordre logique différent. Ici, on suit ce dernier pas à pas.
SELECT pays, COUNT(*) AS nb, SUM(montant) AS total FROM ventes WHERE annee = 2025 GROUP BY pays HAVING SUM(montant) > 1000 ORDER BY total DESC LIMIT 5;
Comment utiliser le visualiseur de requête de sélection SQL ?
L’outil affiche la requête complète en haut de page, avec chaque clause cliquable mise en surbrillance au fur et à mesure de la progression. Le bouton Suivant avance d’une étape et applique la clause correspondante sur les données issues de l’étape précédente. Le bouton Réinitialiser remet l’outil à son état initial avec les 21 lignes intactes.
Chaque étape affiche un tableau interactif dont les colonnes changent selon le contexte. Avant le GROUP BY, le tableau affiche id, pays, annee et montant. Après le GROUP BY, les colonnes passent à pays, count et total pour refléter les données agrégées.
Les 7 étapes de l’exécution
L’outil décompose l’exécution de cette requête en 7 étapes navigables une par une avec les boutons Suivant, Précédent et Réinitialiser. À chaque étape, un tableau miniature affiche les lignes présentes à ce stade du traitement. Le compteur indique précisément le nombre de lignes avant et après l’application de la clause.
Voici ce que fait chaque étape sur les données :
- FROM : charge les 21 lignes complètes de la table
ventesavec toutes les colonnes. - WHERE
annee = 2025: supprime les lignes de 2024, il reste 15 lignes sur 21. - GROUP BY
pays: regroupe les 15 lignes par pays et calculeCOUNT(*)etSUM(montant). - HAVING
SUM(montant) > 1000: élimine les groupes dont le total est inférieur ou égal à 1 000 €. - SELECT : projette uniquement les colonnes utiles :
pays,nbettotal. - ORDER BY
total DESC: trie les groupes du montant le plus élevé au plus bas. - LIMIT 5 : conserve uniquement les 5 premières lignes du résultat trié.
La différence clé entre WHERE et HAVING
WHERE filtre les lignes avant le regroupement : il opère sur des données brutes, ligne par ligne. HAVING filtre les groupes après le GROUP BY : il opère sur des valeurs agrégées comme SUM() ou COUNT(). Utiliser HAVING à la place de WHERE pour filtrer des données non agrégées est une erreur courante qui dégrade les performances.
Dans cet exemple, WHERE annee = 2025 réduit les lignes de 21 à 15 avant le regroupement. Si cette condition était placée dans HAVING, le moteur aurait d’abord regroupé les 21 lignes des deux années, puis tenté de filtrer sur une colonne non agrégée. Le résultat aurait été incorrect ou rejeté selon le SGBD utilisé.
-- ✅ Correct : WHERE filtre avant le GROUP BY
SELECT pays, COUNT(*) AS nb, SUM(montant) AS total
FROM ventes
WHERE annee = 2025
GROUP BY pays
HAVING SUM(montant) > 1000
ORDER BY total DESC
LIMIT 5;
-- ❌ Incorrect : HAVING ne peut pas remplacer WHERE sur une colonne brute
SELECT pays, COUNT(*) AS nb, SUM(montant) AS total
FROM ventes
GROUP BY pays
HAVING annee = 2025 AND SUM(montant) > 1000
ORDER BY total DESC
LIMIT 5;
Pourquoi l’ordre d’exécution SQL est souvent mal compris
En SQL, l’ordre dans lequel on écrit une requête n’est pas l’ordre dans lequel le moteur l’exécute. Un débutant écrit SELECT en premier, mais le moteur commence toujours par lire les données avec FROM. Comprendre cet ordre réel est indispensable pour écrire des requêtes correctes et éviter des erreurs logiques.
La confusion la plus fréquente concerne WHERE et HAVING : beaucoup les utilisent indifféremment, sans savoir que l’un filtre les lignes avant le regroupement et l’autre après. L’ordre d’exécution réel est : FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. Ce visualiseur rend cet ordre concret en simulant chaque étape sur un vrai jeu de données.
Ce que contient le jeu de données
L’outil s’appuie sur une table ventes de 21 lignes réparties sur 9 pays : FR, DE, ES, IT, US, CA, GB, PT et SE. Chaque ligne contient un identifiant, un code pays, une année (2024 ou 2025) et un montant de vente en euros. La requête complète analysée est la suivante :
SELECT pays, COUNT(*) AS nb, SUM(montant) AS total
FROM ventes
WHERE annee = 2025
GROUP BY pays
HAVING SUM(montant) > 1000
ORDER BY total DESC
LIMIT 5;
ARTICLES LIÉS
SQL SELECT: Comment écrire une requête select en SQL
La requête SQL SELECT extrait des données depuis une ou plusieurs tables d’une base de données relationnelle et retourne un résultat sous forme de tableau. Syntaxe de baseSélectionner toutes les colonnesSélectionner des colonnes précisesUtiliser un alias avec ASOrdre d’exécution des clausesBonnes pratiquesCas pratiqueErreurs courantes Syntaxe de base La syntaxe de la commande…