Accéder au contenu principal

Comment utiliser GROUP BY et HAVING en SQL

Un guide intuitif pour découvrir les deux commandes SQL les plus populaires pour agréger les lignes de votre jeu de données.
Actualisé 14 nov. 2024  · 6 min de lecture

L'agrégation est un autre nom pour résumer vos points de données afin d'obtenir une valeur unique. Par exemple, le calcul de la moyenne ou du minimum. Parfois, l'agrégation de toutes vos données aboutit à une valeur qui n'est pas utile.

Par exemple, si vous étudiez le comportement d'achat dans votre magasin et que les clients sont un mélange d'étudiants pauvres et de professionnels riches, il sera plus instructif de calculer les dépenses moyennes pour ces groupes séparément. En d'autres termes, vous devez agréger les montants dépensés, regroupés par différents segments de clientèle.

Ce didacticiel traite de l'instruction SQL GROUP BY, ainsi que de l'instruction HAVING qui vous permet de contrôler les lignes de données incluses dans chaque groupe. 

HAVING est étroitement lié à l'instruction WHERE, et vous pouvez lire l'introduction à la clause WHERE dans SQL. clause WHERE en SQL en premier lieu. Vous devez également comprendre les instructions SELECT et FROM, comme indiqué dans la section Exemples de requêtes SQL et didacticiel.

Pour exécuter facilement tous les exemples de code de ce tutoriel, vous pouvez créer gratuitement un classeur DataLab avec SQL, la base de données et tous les exemples de code préchargés pour vous.

Commençons !

Base de données des entreprises de la licorne

Nous utiliserons la base de données des entreprises licornes, qui est disponible sur DataLab, le carnet de données basé sur l'IA de DataCamp. Ces entreprises sont appelées "licornes" parce qu'il s'agit de startups dont l'évaluation dépasse le milliard de dollars. Cette base de données contient donc les données de ces entreprises licornes et est composée de sept tableaux. Pour simplifier, nous nous concentrerons sur trois tableaux : companies, sales, et product_emissions.

Utilisation de SQL GROUP BY

GROUP BY est une commande SQL couramment utilisée pour agréger les données afin d'en tirer des informations. Le regroupement des données se fait en trois phases :

  • Fractionnement : l'ensemble de données est divisé en morceaux de lignes sur la base des valeurs des variables que nous avons choisies pour l'agrégation.
  • Postulez : Calculer une fonction agrégée, comme la moyenne, le minimum et le maximum, renvoyant une valeur unique.
  • Combiner : Tous ces résultats sont regroupés dans un tableau unique. De cette façon, nous aurons une seule valeur pour chaque modalité de la variable d'intérêt.

SQL GROUP BY Exemple 1

Nous pouvons commencer par montrer un exemple simple de GROUP BY. Supposons que nous voulions trouver les dix pays qui comptent le plus grand nombre d'entreprises licornes. 

SELECT * 
FROM companies

Screenshot 2023-02-21 at 19.04.00.png

Il serait également intéressant de classer les résultats par ordre décroissant en fonction du nombre d'entreprises.

SELECT country, COUNT(*) AS n_companies
FROM companies
GROUP BY country
ORDER BY n_companies DESC
LIMIT 10

image4.png

Voici les résultats. Vous ne serez probablement pas surpris de trouver les États-Unis, la Chine et l'Inde dans le classement. Expliquons la décision qui sous-tend cette requête : 

  • Tout d'abord, remarquez que nous avons utilisé COUNT(*) pour compter les lignes de chaque groupe, qui correspond au pays. En outre, nous avons également utilisé l'alias SQL pour renommer la colonne en un nom plus explicite. Cela est possible en utilisant le mot-clé AS, suivi du nouveau nom. COUNT est abordé plus en détail dans le tutoriel sur la FONCTION SQL COUNT().
  • Les champs ont été sélectionnés dans le tableau des entreprises, où chaque ligne correspond à une entreprise de la Licorne. 
  • Ensuite, nous devons spécifier le nom de la colonne après GROUP BY pour agréger les données en fonction du pays. 
  • ORDER BY est nécessaire pour visualiser les pays dans le bon ordre, du plus grand au plus petit nombre d'entreprises. 
  • Nous limitons les résultats à 10 en utilisant LIMIT, qui est suivi par le nombre de lignes que vous souhaitez voir apparaître dans les résultats.

SQL GROUP BY Exemple 2 

Nous allons maintenant analyser le tableau des ventes. Pour chaque numéro de commande, nous avons le type de client, la ligne de produits, la quantité, le prix unitaire, le total, etc.

Screenshot 2023-02-21 at 19.05.13.png

Cette fois, nous souhaitons connaître le prix moyen par unité, le nombre total de commandes et le gain total pour chaque ligne de produits :

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
GROUP BY product_line
ORDER BY total_gain DESC

image7.png

  • Au lieu de compter le nombre de lignes, nous disposons de la fonction AVG() pour obtenir le prix moyen et de la fonction SUM() pour calculer le nombre total de commandes et le gain total pour chaque ligne de produits. 
  • Comme précédemment, nous spécifions la colonne qui divise initialement l'ensemble de données en morceaux. Ensuite, les fonctions d'agrégation nous permettront d'obtenir une ligne pour chaque modalité de la ligne de produits. 
  • Cette fois, ORDER BY est facultatif. Il a été inclus pour souligner le fait que les gains totaux plus élevés ne sont pas toujours proportionnels à des prix moyens ou à des pièces totales plus élevés. 

Les limites de la WHERE

Reprenons l'exemple précédent. Nous voulons maintenant ajouter une condition à la requête : nous ne voulons filtrer que le nombre total de commandes supérieur à 40 000. Essayons la clause WHERE:

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
WHERE SUM(total) > 40000
GROUP BY product_line
ORDER BY total_gain DESC

Cette requête renvoie l'erreur suivante :

image1.png

Cette erreur ne permet pas de passer des fonctions agrégées dans la clause WHERE. Nous avons besoin d'une nouvelle commande pour résoudre ce problème.

Utilisation de SQL HAVING

Comme WHERE, la clause HAVING filtre les tableaux. Alors que WHERE essayait de filtrer l'ensemble du tableau, HAVING filtre les tableaux à l'intérieur de chacun des groupes définis par GROUP BY

Exemple SQL HAVING 1

Reprenez l'exemple précédent en remplaçant le mot WHERE par HAVING.

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
GROUP BY product_line
HAVING SUM(total) > 40000
ORDER BY total_gain DESC

image10.png

Cette fois-ci, il produira trois lignes. Les autres lignes de produits ne correspondaient pas au critère, de sorte que nous sommes passés de six à trois résultats. 

Que remarquez-vous d'autre dans la requête ? Nous n'avons pas transmis l'alias de la colonne à HAVING, mais l'agrégation du champ original. Vous demandez-vous pourquoi ? Vous découvrirez le mystère dans l'exemple suivant.

Exemple SQL HAVING 2

Comme dernier exemple, nous utiliserons le tableau appelé product_emissions, qui contient l'émission des produits fournis par les entreprises.

Screenshot 2023-02-21 at 19.07.31.png

Cette fois-ci, nous souhaitons montrer l'empreinte carbone moyenne des produits (pcf) pour chaque entreprise appartenant au groupe industriel "Matériel et équipement technologique". En outre, il serait utile de connaître le nombre de produits de chaque entreprise pour comprendre s'il existe une relation entre le nombre de produits et l'empreinte carbone. Nous utilisons également HAVING pour extraire les entreprises dont l'empreinte carbone moyenne est supérieure à 100.

SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg_carbon_footprint_pcf>100
ORDER BY n_products

image5.png

Une erreur est apparue après avoir essayé d'utiliser l'alias. Pour la clause HAVING, le nom de la nouvelle colonne n'existe pas, elle ne pourra donc pas filtrer la requête. Corrigeons la demande :

SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg(carbon_footprint_pcf)>100
ORDER BY n_products

image3.png

Cette fois, la condition a fonctionné et nous pouvons visualiser les résultats dans le tableau. Nous venons d'apprendre que les alias de colonne ne peuvent pas être utilisés dans HAVING parce que cette condition est appliquée avant SELECT. C'est pourquoi il ne peut pas reconnaître les champs à partir des nouveaux noms.

Ordre d'exécution SQL

Il s'agit de l'ordre des commandes lors de la rédaction de la requête :

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

Mais il y a une question que vous devez vous poser. Dans quel ordre les commandes SQL s'exécutent-elles ? En tant qu'humains, nous tenons souvent pour acquis que l'ordinateur lit et interprète SQL de haut en bas. Mais la réalité est différente de ce que l'on pourrait croire. C'est le bon ordre d'exécution :

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT

 Ainsi, le processeur de requêtes ne commence pas à partir de SELECT, mais il commence par sélectionner les tableaux à inclure, et SELECT est exécuté après HAVING. Cela explique pourquoi HAVING ne permet pas l'utilisation de ALIAS, alors que ORDER BY n'a pas de problème avec elle. Outre cet aspect, cet ordre d'exécution clarifie la raison pour laquelle HAVING est utilisé avec GROUP BY pour appliquer des conditions aux données agrégées, alors que WHERE ne le peut pas. 

Passez au niveau supérieur

Après avoir lu ce tutoriel, vous devriez avoir une idée claire de la différence entre GROUP BY et HAVING. Vous pouvez vous entraîner sur DataLab pour maîtriser ces concepts.

Si vous souhaitez passer au niveau suivant du parcours d'apprentissage SQL, vous pouvez suivre notre cours SQL intermédiaire. Si vous avez encore besoin de renforcer vos bases en SQL, vous pouvez revenir au cours Introduction à SQL pour apprendre les principes fondamentaux du langage. 

Devenez certifié SQL

Prouvez que vos compétences en SQL sont prêtes à l'emploi grâce à une certification.
Booster Ma Carrière
Sujets

Cours SQL

cours

Introduction to SQL

2 hr
919.4K
Learn how to create and query relational databases using SQL in just two hours.
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow
Apparenté

blog

Les 32 meilleures questions d'entretien sur AWS et leurs réponses pour 2024

Un guide complet pour explorer les questions d'entretien AWS de base, intermédiaires et avancées, ainsi que des questions basées sur des situations réelles. Il couvre tous les domaines, garantissant ainsi une stratégie de préparation bien équilibrée.
Zoumana Keita 's photo

Zoumana Keita

30 min

blog

Les 20 meilleures questions d'entretien pour les flocons de neige, à tous les niveaux

Vous êtes actuellement à la recherche d'un emploi qui utilise Snowflake ? Préparez-vous à répondre à ces 20 questions d'entretien sur le flocon de neige pour décrocher le poste !
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

20 min

See MoreSee More