Introduction à la clause SQL HAVING

La question très fondamentale qui vient à l'esprit est quelle est cette clause HAVING? Eh bien, la clause HAVING est utilisée pour filtrer les résultats d'une requête SQL avec des fonctions d'agrégation. Pour comprendre en langage simple, il commande à l'analyseur SQL «Hey SQL, à partir de notre tableau de données client, récupérez-moi les noms des pays ayant plus d'un million de clients».

Attendez, c'est ce que fait la clause WHERE, n'est-ce pas? Oui, c'est très similaire au fonctionnement de la clause WHERE mais avec une légère différence. La clause WHERE ne fonctionne pas avec les fonctions d'agrégation.

Maintenant, pour récapituler un peu les fonctions d'agrégation, ce sont des fonctions qui prennent plusieurs lignes en entrée et donnent une sortie traitée de manière plus significative. Quelques exemples sont Count (), Sum (), Min (), Max (), Avg () etc.

Pourquoi AVOIR et non OERE?

Nous voyons que les clauses HAVING et WHERE effectuent une tâche très similaire pour filtrer les résultats. Alors, quelle était la nécessité de la clause HAVING? Pourquoi la clause WHERE ne pouvait-elle pas être utilisée avec des fonctions d'agrégation?

Pour répondre à cela, nous aurions besoin de comprendre comment le moteur SQL traite les deux clauses. La clause FROM de chaque commande SQL indique au moteur d'où lire les lignes. Les données sont stockées sur le disque et récupérées dans la mémoire pour traitement. Au fur et à mesure que les lignes sont lues une par une du disque vers la mémoire, la clause WHERE est vérifiée. Les lignes qui échouent à la clause WHERE ne sont pas chargées dans la mémoire. Ainsi, la clause WHERE est évaluée pour chaque ligne lors de leur traitement par le moteur SQL.

Au contraire, la clause HAVING n'apparaît dans l'image qu'après le chargement des lignes dans la mémoire. Une fois chargées dans la mémoire, les fonctions d'agrégation effectuent leur tâche sur les lignes AYANT la condition souhaitée.

Maintenant, si nous devions mettre une clause WHERE avec la fonction d'agrégation telle que avg (), cela confondrait le moteur SQL sur l'inclusion ou non de la ligne de calcul de la moyenne. Essentiellement, nous ordonnerions au moteur de ne pas lire la ligne car il n'a pas passé les critères avg () dans la clause WHERE. Mais bon, pour déterminer si elle a réussi ou échoué les critères de calcul avg (), la ligne doit être lue dans la mémoire. Un état de blocage.

La syntaxe

SELECT
FROM


OERE - facultatif
GROUP BY - regroupe les lignes auxquelles appliquer la fonction d'agrégation
AYANT - fonction d'agrégation dans la condition
COMMANDÉ PAR ; - définir l'ordre de tri, facultatif

Remarque - La clause GROUP BY est requise avec la clause HAVING. En effet, la clause having a besoin d'un groupe de données pour appliquer une fonction d'agrégation et filtrer les résultats.

Comment fonctionne la clause HAVING?

Comprenons le fonctionnement de la clause HAVING en SQL.

La clause HAVING est toujours accompagnée de la clause GROUP BY. La clause GROUP BY regroupe les données qui correspondent à un certain critère. Il comporte trois phases: fractionner, appliquer et combiner. La phase de division divise les lignes en groupes. La phase d'application applique certaines fonctions d'agrégation aux groupes de données. La phase combinée produit un résultat unique en combinant les groupes avec le résultat de la fonction agrégée.

Maintenant que les groupes sont formés, la clause HAVING apparaît dans l'image. La clause HAVING filtre ensuite les groupes qui ne satisfont pas à la condition donnée.

SELECT Col_A, avg(Col_B) as Col_B
FROM MyTable
GROUP BY Col_A
HAVING avg(Col_B)>30

Ainsi, dans l'exemple ci-dessus, nous voyons que la table est d'abord divisée en trois groupes en fonction de la colonne Col_A. La fonction d'agrégation pour calculer la moyenne des valeurs Col_B est ensuite appliquée aux groupes. Il en résulte une seule ligne pour chaque groupe. Les lignes sont ensuite combinées et filtrées en fonction de la condition dans la clause HAVING.

Exemple

Voyons maintenant un exemple concret. Considérez que nous avons le tableau suivant des clients et les commandes qu'ils ont passées avec nous.

N ° de clientCustomerNameVillePays
1Anja DamianBerlinAllemagne
2Denny CockettMéxico DFMexique
3Eleanor CalnanMéxico DFMexique
4Albertha AlburyLondresRoyaume-Uni
5Latisha NembhardLuleåSuède
6Madalene BingMannheimAllemagne
septRebecka BeegleStrasbourgFrance
8Rosy TippieMadridEspagne
9Audie KhanMarseilleFrance
dixHildegard BurrowesTsawassenCanada
11Cordell DutrembleLondresRoyaume-Uni
12Nora ReynaBuenos AiresArgentine
13Ursula LaforestMéxico DFMexique
14Claudie NeelBerneSuisse
15Portia YeeSão PauloBrésil
16Angila SegarraLondresRoyaume-Uni
17Lise WexlerAix-la-ChapelleAllemagne
18Ned MendivilNantesFrance
19Sara VidaurriLondresRoyaume-Uni
20Tayna NavinGrazL'Autriche
21Pura RaySão PauloBrésil
22Erika ByardMadridEspagne
23Jimmie LukeLilleFrance
24Shayla ByingtonBräckeSuède
25Christiana BodenMunichAllemagne
26Irina NittaNantesFrance
27Bryanna AllsTorinoItalie
28Norah PickenLisboale Portugal
29Moriah StwartBarceloneEspagne
30Idella HarriottSevillaEspagne
Numéro de commandeN ° de clientDate de commande
102541411-07-1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265sept25-07-1996
102672529-07-1996
10278512-08-1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
10297sept04-09-1996
103033011-09-1996
10308218-09-1996
103111820-09-1996
10326810-10-1996
103272411-10-1996
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
103522812-11-1996
10355415-11-1996
10360sept22-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
103701403-12-1996
103782410-12-1996
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
10389dix20-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
10410dix10-01-1997
10411dix10-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
10431dix30-01-1997
104342403-02-1997
104351604-02-1997
10436sept05-02-1997
104422011-02-1997

Maintenant, nous voulons connaître les clients de quels pays ont passé un total combiné de 5 commandes ou plus avec nous. Il peut s'agir d'un seul client passant plus de 5 commandes ou de 5 clients passant 1 commande chacun.

Pour ce faire, nous devons

Étape 1 : Rejoignez les deux tables

Étape 2: regrouper les clients en fonction de leur pays

Étape 3: compter le nombre de commandes pour chaque groupe

Étape 4: filtrer les résultats pour 5 commandes ou plus

Formulons la commande:

SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC

Voici les résultats:

PaysNombre de commandes
L'Autrichedix
France9
Suèdesept
Allemagne6
Royaume-Uni6

Conclusion - Clause SQL HAVING

Ainsi, nous avons vu quel est le but de la clause HAVING et comment cela fonctionne. Il est important de comprendre le fonctionnement de base, sinon vous risquez de vous tromper sur la raison pour laquelle la clause HAVING ne produit pas les résultats souhaités. Continuez à jouer avec différentes tables et jointures et combinaisons avec la clause HAVING.

Articles recommandés

Ceci est un guide de la clause SQL HAVING. Nous discutons ici du fonctionnement de la clause HAVING en SQL et de l'exemple avec le tableau de clients suivant. Vous pouvez également consulter nos autres articles suggérés -

  1. Requête d'insertion SQL
  2. Clé étrangère en SQL
  3. Mot clé distinct dans SQL
  4. Vues SQL
  5. Top 6 des exemples de requêtes de jointure interne dans Oracle