2nd Dec 2022 6 minutes de lecture Qu'est-ce que la clause HAVING en SQL ? András Novoszáth sql apprendre sql avoir group by Table des matières L'ensemble de données et le problème GROUP BY : Un résumé Quand utiliser les HAVING SQL La syntaxe SQL HAVING Exemples de HAVING Vous ne pouvez pas utiliser WHERE pour filtrer des groupes Utiliser à la fois WHERE et HAVING dans une requête Apprenez-en plus sur le SQL HAVING ! Vous apprenez le SQL ? Vous vous demandez à quoi peut servir la clause clause HAVING ? Ou, peut-être, avez-vous essayé d'utiliser WHERE sur vos agrégats agrégats GROUP BY ? Vous êtes au bon endroit ! Dans cet article, nous vous expliquons comment utiliser HAVING avec de nombreux exemples. Avez-vous essayé de filtrer vos métriques que vous avez créées avec GROUP BY avec une clause WHERE et découvert que cela ne fonctionnait pas ? C'est parce que ce n'est pas ce que fait WHERE. Vous avez besoin d'une clause HAVING! Dans cet article, nous allons vous expliquer comment utiliser HAVING pour filtrer vos données agrégées. Vous apprendrez quand et comment l'utiliser, quelle est sa syntaxe et quelle est la différence avec WHERE. Nous vous montrerons tout cela à l'aide d'exemples détaillés provenant d'une société de location de films. Vous êtes prêts ? C'est parti ! L'ensemble de données et le problème Dans cet article, nous utilisons la table film de l'ensemble de données d'échantillon Sakila. Elle contient une liste de films que vous pouvez louer auprès d'un service fictif de location de DVD. Voici un exemple de requête et son résultat. SELECT title, release_year, language_id, rental_duration, length, rating FROM film LIMIT 10; titlerelease_yearlanguage_idrental_durationlengthrating ACADEMY DINOSAUR20061686PG ACE GOLDFINGER20061348G ADAPTATION HOLES20061750NC-17 AFFAIR PREJUDICE200615117G AFRICAN EGG200616130G AGENT TRUMAN200613169PG AIRPLANE SIERRA20061662PG-13 AIRPORT POLLOCK20061654R ALABAMA DEVIL200613114PG-13 ALADDIN CALENDAR20061663NC-17 Avec ces données, nous voulons voir quels types de films les gens louent pour des périodes plus ou moins longues. Ces informations nous permettront d'identifier le type de films et de publics sur lesquels nous pourrions nous concentrer. GROUP BY : Un résumé Nous utilisons HAVING sur les groupes créés avec une clause GROUP BY. Rappelons rapidement comment nous agrégeons les données avec GROUP BY. Nous utilisons GROUP BY pour résumer nos données en métriques agrégées. Nous avons besoin de deux choses pour cela : Une fonction d'agrégation comme COUNT, MAX, ou AVG. Une colonne sur laquelle effectuer l'agrégation. Par exemple, nous voulons savoir combien de films nous avons dans chaque catégorie de classement. Pour répondre à cette question, nous utilisons COUNT(*) pour compter le nombre de films dans chaque groupe, et nous utilisons GROUP BY pour agréger cette métrique en fonction des valeurs de la colonne rating: SELECT rating, COUNT(*) AS films FROM film GROUP BY rating ORDER BY rating; ratingfilms G178 PG194 PG-13223 R195 NC-17210 Le résultat montre le nombre de films par classement. La distribution des films par classement est relativement homogène. Le classement le plus populaire est PG-13, tandis que le moins populaire est G. Pour en savoir plus sur GROUP BY, consultez cet article détaillé ou cette liste d'exemples pratiques. Maintenant que nous avons examiné ce qu'est GROUP BY, nous pouvons le combiner avec HAVING ! Quand utiliser les HAVING SQL La principale utilisation de l'opération HAVING est de filtrer des données agrégées. Vous pouvez l'utiliser lorsque vous résumez vos données avec GROUP BY en de nouvelles valeurs métriques, et que vous voulez sélectionner les résultats en fonction de ces nouvelles valeurs. Elle est similaire à WHERE, mais vous les utilisez dans des circonstances différentes. À la fin de cet article, vous découvrirez cette différence en détail. La syntaxe SQL HAVING En termes de syntaxe, HAVING nécessite simplement une ligne après GROUP BY. L'extrait suivant résume la syntaxe requise pour utiliser une clause HAVING: SELECT aggregate_function(column) FROM table GROUP BY column_to_aggregate_on HAVING condition_on_aggregate_metric; Cette syntaxe est concise, mais voyons comment elle fonctionne à travers des exemples ! Exemples de HAVING Supposons que nous voulions savoir quels films les gens louent pour des durées plus ou moins longues. Nous pourrions nous intéresser à la durée de location par classement. Par exemple, se concentrer sur les films dont la durée de location est plus courte pourrait nous permettre d'avoir une rotation globale plus rapide. Voyons ce que les données peuvent nous apprendre sur cette question ! Nous créons deux métriques agrégées regroupées par classement. Ensuite, nous utilisons HAVING pour filtrer le tableau résultant sur la durée moyenne de location (avg_rentdur). SELECT rating, COUNT(*) AS films, AVG(rental_duration), AVG(length) FROM film GROUP BY rating HAVING AVG(rental_duration) > 5 HAVING Cette fonction sélectionne les données en fonction d'une condition sur un groupe que nous avons créé avec une fonction d'agrégation (AVG). ratingfilmsAVG(rental_duration)AVG(length) PG1945.0825112.0052 NC-172105.1429113.2286 PG-132235.0538120.4439 Le résultat ne comprend pas les films classés G et R, car leur durée moyenne de location est inférieure à 5 jours. Les gens louent des films classés PG, PG-13 ou NC-17 pendant des périodes plus longues. Intéressant ! Puisque nous examinons les catégories en fonction de leur durée de location, filtrons davantage nos résultats. Nous allons également supprimer les classements dont la durée moyenne est supérieure à deux heures. Pour ce faire, nous ajoutons une autre condition de groupe à la clause HAVING: SELECT rating, COUNT(*) AS films, AVG(rental_duration), AVG(length) FROM film GROUP BY rating HAVING AVG(rental_duration) > 5 AND AVG(length) < 120; La condition supplémentaire sur AVG(length) filtre le classement PG-13. ratingfilmsAVG(rental_duration)AVG(length) PG1945.0825112.0052 NC-172105.1429113.2286 Bien joué ! Vous ne pouvez pas utiliser WHERE pour filtrer des groupes Nous avons mentionné que HAVING est similaire à WHERE, mais nous les utilisons dans des scénarios différents. Voyons comment cela se passe dans notre exemple. Remplaçons HAVING par WHERE dans la requête que nous venons d'écrire : SELECT rating, COUNT(*) AS films, AVG(rental_duration), AVG(length) FROM film GROUP BY rating WHERE AVG(rental_duration) > 5 Cependant, cela entraîne le message d'erreur suivant : ERREUR 1064 (42000) : Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel correspondant à votre version du serveur MySQL pour connaître la syntaxe à utiliser près de 'WHERE avg_rentdur > 5' à la ligne 9. Ceci est dû au fait que les clauses GROUP BY sont exécutées après les clauses WHERE. Cette requête tente d'appliquer WHERE sur avg_rentdur alors que avg_rentdur n'existe pas encore ! Cela signifie que nous ne pouvons utiliser WHERE que sur des données "brutes" et non sur des valeurs agrégées. Nous devons utiliser HAVING sur les métriques agrégées. Utiliser à la fois WHERE et HAVING dans une requête Nous avons vu que nous utilisons WHERE pour filtrer des lignes individuelles et HAVING pour filtrer des groupes. Pour mieux montrer leur différence, voyons un exemple dans lequel nous utilisons à la fois HAVING et WHERE ! Nous voulons savoir si nos résultats précédents changent lorsque nous nous concentrons sur les films courts. Pour cela, nous limitons la durée des films à 60 minutes. Dans notre requête, nous faisons cela en appliquant WHERE sur la colonne length : SELECT rating, COUNT(*) AS films, AVG(rental_duration), AVG(length) FROM film WHERE length < 60 GROUP BY rating HAVING AVG(rental_duration) < 5; ratingfilmsAVG(rental_duration)AVG(length) G214.381053.0952 NC-17214.904851.3810 R114.636455.0000 Les résultats montrent que si nous nous concentrons uniquement sur les films courts, nous trouvons plusieurs films classés NC-17 avec des locations courtes en moyenne. Cette constatation peut nous donner des idées sur le type de films que nous pouvons introduire dans notre future sélection d'offres. Vous voulez en savoir plus sur les différences entre HAVING et WHERE? Consultez notre article détaillé sur le sujet ! Apprenez-en plus sur le SQL HAVING ! Vous aimez ce que vous venez d'apprendre ? Faites en sorte de ne pas l'oublier ! Le meilleur moyen d'apprendre SQL est de résoudre des problèmes à l'aide d'exemples nouveaux et stimulants. Vous pouvez configurer le même environnement de test que nous utilisons ici, importer le même ensemble de données et réécrire les requêtes que vous venez d'apprendre. Cependant, cela pourrait demander beaucoup de travail et vous ne feriez que recréer les mêmes exemples. Nous vous recommandons plutôt de consulter notre cours pratique! Il vous aidera à pratiquer le SQL HAVING et d'autres clauses à travers des exemples nouveaux et stimulants ! Qu'en pensez-vous ? Êtes-vous prêt à le suivre ? Tags: sql apprendre sql avoir group by