WHERE filtre les lignes individuelles avant l'agrégation ; HAVING filtre les groupes après l'agrégation. Vous filtrez donc sur les colonnes brutes dans WHERE et sur les résultats agrégés comme COUNT ou SUM dans HAVING. Filtrez autant que possible dans WHERE, puisque réduire le nombre de lignes avant le regroupement coûte moins cher. Un bug classique consiste à mettre un filtre de date dans HAVING, ce qui agrège quand même tout d'abord et peut changer les résultats.
Pourquoi les recruteurs posent cette question
Cela révèle si vous comprenez l'ordre logique d'exécution du SQL au lieu de reproduire une syntaxe par mimétisme. Les recruteurs enchaînent souvent sur des questions liées : pourquoi on ne peut pas référencer un alias de colonne dans WHERE, ou pourquoi un filtre placé dans la mauvaise clause a changé les chiffres, deux choses qui découlent du même ordre d'exécution.
Comment structurer votre réponse
- Ancrez la réponse dans l'ordre logique d'exécution.
- Donnez la règle : colonnes brutes dans WHERE, agrégats dans HAVING.
- Expliquez la raison de performance qui pousse à filtrer tôt.
- Mentionnez la visibilité des alias comme conséquence du même ordre.
Exemple de réponse
Tout tient au moment où chaque clause s'exécute. WHERE intervient avant le regroupement, donc il filtre les lignes individuelles. HAVING intervient après, donc il filtre les groupes agrégés. Si je veux les commandes de cette année, c'est WHERE. Si je veux seulement les clients ayant plus de cinq commandes, ça doit être HAVING, parce que le compte n'existe pas encore au moment du WHERE. Je pousse toujours les filtres le plus loin possible dans WHERE, puisque regrouper dix mille lignes au lieu de dix millions fait une vraie différence sur une grosse table. Le même ordre d'exécution explique une chose qui piège pas mal de monde : vous ne pouvez pas référencer un alias du SELECT dans WHERE, parce que la liste SELECT est évaluée après le filtre, même si la plupart des moteurs vous laissent utiliser l'alias dans GROUP BY et ORDER BY, ce qui paraît incohérent tant qu'on ne connaît pas l'ordre. Et le bug que j'ai réellement dû corriger, c'était un filtre de date dans HAVING qui produisait des totaux d'apparence correcte sur la mauvaise fenêtre.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Pourquoi ne peut-on pas utiliser un alias du SELECT dans la clause WHERE ?
- Comment filtreriez-vous sur un agrégat sans HAVING ?
- Quel est l'ordre logique d'exécution d'une instruction SELECT ?
Autres questions pour Analyste de données
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions