0Pricing
SQL Academy · Leçon

HAVING contre WHERE

Distinguez HAVING (qui filtre les groupes) de WHERE (qui filtre les lignes) et appliquez-les correctement dans une même requête.

HAVING contre WHERE est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 3 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 SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.

Deux étapes de filtrage

WHERE filtre les lignes individuelles BEFORE le regroupement. HAVING filtre les groupes AFTER l’agrégation. Ils se ressemblent, mais interviennent à des étapes différentes.

Exemple avec WHERE

WHERE filtre les lignes brutes. Il ne peut pas accéder aux agrégats :

-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;

Exemple avec HAVING

HAVING filtre les groupes. Il peut faire référence aux agrégats :

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5;     -- only users with ≥ 5 orders

Combiner WHERE et HAVING

Les deux peuvent apparaître dans la même requête :

SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;

Ne placez pas d’agrégats dans WHERE

Le planificateur exécute WHERE avant le regroupement — les agrégats ne sont pas encore disponibles :

-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5         -- ERROR
GROUP BY user_id;

-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;

Déplacez les prédicats vers WHERE quand c’est possible

WHERE filtre avant le regroupement, ce qui réduit le nombre de lignes transmises à l’agrégation. Utilisez HAVING uniquement pour les conditions qui ne peuvent pas être exprimées dans WHERE.

-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);

-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;

Ordre logique d’exécution

Ordre conceptuel :

  1. FROM — sélectionner les tables et effectuer la jointure
  2. WHERE — filtrer les lignes
  3. GROUP BY — créer les groupes
  4. HAVING — filtrer les groupes
  5. SELECT — projeter les colonnes
  6. ORDER BY — trier
  7. LIMIT — sélectionner les N premiers éléments

HAVING sans GROUP BY

Vous pouvez utiliser HAVING sans GROUP BY : toute la table devient un seul groupe :

SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000;       -- prints only if total over 1M

Alias dans HAVING

Certaines bases de données permettent à HAVING de faire référence aux alias de SELECT ; PostgreSQL et MySQL le permettent, contrairement au SQL standard. Pour une meilleure portabilité : répétez l’agrégat :

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5;       -- portable
-- HAVING order_count >= 5  -- works in PG / MySQL

HAVING avec plusieurs agrégats

Utilisez HAVING pour les conditions combinant plusieurs agrégats :

SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;

Remarque sur les performances

Un filtre d’agrégat dans HAVING ne peut pas utiliser les index comme peut le faire WHERE sur une colonne. Déplacez dans WHERE tout ce qui peut l’être.

Récapitulatif

WHERE = filtrer les lignes. HAVING = filtrer les groupes.

  • Les agrégats uniquement dans HAVING, jamais dans WHERE
  • Déplacez les prédicats vers WHERE pour accélérer la requête
  • Utilisez les deux lorsque c’est nécessaire

Vérification rapide

Vous voulez obtenir les utilisateurs qui ont passé plus de 10 commandes. Quelle clause permet ce filtrage ?

Questions Fréquemment Posées

La leçon « HAVING contre WHERE » est-elle gratuite ?

Oui — le texte complet de « HAVING contre 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 SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « HAVING contre WHERE » ?

Distinguez HAVING (qui filtre les groupes) de WHERE (qui filtre les lignes) et appliquez-les correctement dans une même requête. Tu pratiques SQL Academy 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 SQL Academy ?

Aucune expérience préalable n'est requise. SQL Academy 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 3 sur 4.

Combien de temps prend la leçon « HAVING contre 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 SQL Academy ?

Oui. Chaque leçon SQL Academy 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

  1. COUNT, SUM, AVG, MIN, MAX
  2. GROUP BY sur une ou plusieurs colonnes
  3. HAVING contre WHERE
  4. Pièges courants : les NULL dans les agrégats
← Retour à SQL Academy