SELECT VISUALIZER

Par :

,le

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;
Cliquez sur un bouton pour avancer ou reculer dans l’exécution de la requête.

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 idpaysannee et montant. Après le GROUP BY, les colonnes passent à payscount 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 SuivantPré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 ventes avec 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 calcule COUNT(*) et SUM(montant).
  • HAVING SUM(montant) > 1000 : élimine les groupes dont le total est inférieur ou égal à 1 000 €.
  • SELECT : projette uniquement les colonnes utiles : paysnb et total.
  • 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;