HAVING ou WHERE
Filtrer avant ou après le regroupement et déterminer quelle clause voit l’agrégat
HAVING ou WHERE est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.
La question qui vous sera posée
« Quelle est la différence entre WHERE et HAVING ? » est l'une des questions d'entretien SQL les plus fréquentes. Une réponse faible affirme que « HAVING sert aux agrégats ». Une réponse solide explique quand chaque clause est exécutée dans la chaîne de traitement de la requête.
Ce moment d'exécution explique tout : WHERE filtre les lignes avant le regroupement ; HAVING filtre les groupes après l'agrégation.
Leur place dans l'ordre d'exécution
Rappelez-vous l'ordre logique d'exécution d'une requête :
FROM/JOIN→ construit l'ensemble de lignesWHERE→ filtre les lignes individuellesGROUP BY→ regroupe les lignesHAVING→ filtre les groupesSELECT→ projette les colonnesORDER BY→ trie
WHERE est exécuté avant l'existence des groupes ; HAVING est exécuté après, donc HAVING peut accéder aux agrégats, contrairement à WHERE.
WHERE ne peut pas accéder aux agrégats
Comme WHERE est exécuté avant le regroupement, aucune valeur d'agrégat n'est encore disponible. Écrire WHERE COUNT(*) > 5 constitue une erreur de syntaxe dans toute base de données conforme à la norme.
Les recruteurs placent précisément cette ligne pour vérifier que vous comprenez la chaîne de traitement. L'agrégat n'existe pas encore au moment où WHERE est évalué.
-- ERROR: aggregate not allowed in WHERE
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;HAVING filtre les groupes
Déplacez la condition sur l'agrégat dans HAVING : elle fonctionne, car HAVING est exécuté après le calcul des groupes et de leurs agrégats.
Interprétez-la ainsi : « regroupez les employés, puis ne gardez que les services dont le nombre dépasse cinq ».
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Placez les filtres de lignes dans WHERE
L'erreur inverse consiste à filtrer les lignes brutes avec HAVING. Le résultat est souvent correct, mais cette approche est plus lente et trompeuse, car vous avez regroupé des lignes que vous vouliez supprimer.
Règle générale : filtrez sur une valeur de colonne brute → WHERE. Filtrez sur un agrégat → HAVING. Filtrer les lignes tôt réduit la quantité de données que le regroupement doit traiter.
-- Better: drop inactive rows BEFORE grouping
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5;Les deux clauses ensemble
Une requête complète utilise souvent les deux clauses. WHERE réduit d'abord le nombre de lignes ; HAVING conserve ensuite les groupes qui satisfont la condition. La lecture de haut en bas correspond à l'ordre logique.
Exemple détaillé : parmi les commandes passées cette année, trouvez les clients qui ont dépensé plus de 1000 au total.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING SUM(amount) > 1000;HAVING sur des colonnes non agrégées
HAVING peut faire référence à une colonne de regroupement, et pas uniquement aux agrégats. HAVING department = 'Sales' est légal, mais inutile : ce filtre doit se trouver dans WHERE afin d'être exécuté plus tôt.
Si un recruteur vous présente un HAVING qui filtre une simple colonne regroupée, la critique attendue est : « déplacez-le dans WHERE pour améliorer l'efficacité ».
-- Works but inefficient; prefer WHERE department = 'Sales'
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING department = 'Sales';HAVING sans GROUP BY
Cas subtil : HAVING est légal même sans GROUP BY. La table entière devient un unique groupe implicite, et HAVING filtre ce groupe.
Si la condition sur l'agrégat est fausse, vous obtenez zéro ligne ; si elle est vraie, vous obtenez une ligne. Cette construction est rarement utile, mais les recruteurs la demandent pour vérifier que vous comprenez le concept de groupe implicite.
-- Returns the count only if the table has > 100 rows
SELECT COUNT(*) AS total
FROM orders
HAVING COUNT(*) > 100;HAVING peut-il utiliser un alias de SELECT ?
Comme pour l'astuce de portée des alias utilisée ailleurs, les dialectes diffèrent. Postgres et MySQL permettent à HAVING de faire référence à un alias de SELECT ; SQL Server et Oracle ne l'autorisent pas.
L'habitude la plus portable consiste à répéter l'expression d'agrégat dans HAVING. Elle fonctionne avec tous les moteurs et évite les surprises lors d'un entretien portant sur plusieurs bases de données.
-- Portable: repeat the aggregate, do not rely on the alias
SELECT region, SUM(amount) AS total
FROM sales
GROUP BY region
HAVING SUM(amount) > 5000;Le point de vue des performances
Pour vous démarquer, reliez les clauses aux performances : WHERE réduit le nombre de lignes que le moteur de regroupement doit parcourir et peut utiliser les index ; HAVING s'exécute sur des groupes déjà agrégés, donc il ne peut pas réduire le coût du regroupement.
Ce que les recruteurs veulent entendre : appliquez chaque filtre le plus tôt possible. Seules les conditions qui dépendent réellement d'un agrégat nécessitent HAVING.
La réponse en une phrase
Mémorisez ceci pour l'entretien : « WHERE filtre les lignes avant le regroupement et ne peut pas accéder aux agrégats ; HAVING filtre les groupes après l'agrégation et est la seule clause qui puisse évaluer une valeur d'agrégat. »
Ajoutez ensuite la liste de l'ordre d'exécution et vous aurez donné une réponse complète, digne d'un profil expérimenté.
Vérification rapide
Déterminez à quelle clause appartient chaque condition.
Récapitulatif
WHERE : filtre les lignes avant GROUP BY ; les agrégats ne sont pas autorisés. HAVING : filtre les groupes après l'agrégation ; c'est le seul endroit où une condition sur un agrégat est légale.
- Placez les filtres sur les colonnes brutes dans WHERE pour gagner en rapidité et permettre l'utilisation des index.
- HAVING peut faire référence aux colonnes regroupées, mais ne devrait pas le faire pour les filtres simples.
- HAVING fonctionne sans GROUP BY sur le groupe implicite constitué par toute la table.
- Répétez les expressions d'agrégat dans HAVING pour garantir la compatibilité entre dialectes.
Questions Fréquemment Posées
La leçon « HAVING ou WHERE » est-elle gratuite ?
Oui — le texte complet de « HAVING ou WHERE » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « HAVING ou WHERE » ?
Filtrer avant ou après le regroupement et déterminer quelle clause voit l’agrégat Tu pratiques Coding Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Coding Interview Prep ?
Aucune expérience préalable n'est requise. Coding Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « HAVING ou WHERE » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Coding Interview Prep ?
Oui. Chaque leçon Coding Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- La règle GROUP BY pour les colonnes SELECT
- HAVING ou WHERE
- Regrouper selon plusieurs colonnes et expressions
- Compter et filtrer les groupes