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
N ° de client | CustomerName | Ville | Pays |
1 | Anja Damian | Berlin | Allemagne |
2 | Denny Cockett | México DF | Mexique |
3 | Eleanor Calnan | México DF | Mexique |
4 | Albertha Albury | Londres | Royaume-Uni |
5 | Latisha Nembhard | Luleå | Suède |
6 | Madalene Bing | Mannheim | Allemagne |
sept | Rebecka Beegle | Strasbourg | France |
8 | Rosy Tippie | Madrid | Espagne |
9 | Audie Khan | Marseille | France |
dix | Hildegard Burrowes | Tsawassen | Canada |
11 | Cordell Dutremble | Londres | Royaume-Uni |
12 | Nora Reyna | Buenos Aires | Argentine |
13 | Ursula Laforest | México DF | Mexique |
14 | Claudie Neel | Berne | Suisse |
15 | Portia Yee | São Paulo | Brésil |
16 | Angila Segarra | Londres | Royaume-Uni |
17 | Lise Wexler | Aix-la-Chapelle | Allemagne |
18 | Ned Mendivil | Nantes | France |
19 | Sara Vidaurri | Londres | Royaume-Uni |
20 | Tayna Navin | Graz | L'Autriche |
21 | Pura Ray | São Paulo | Brésil |
22 | Erika Byard | Madrid | Espagne |
23 | Jimmie Luke | Lille | France |
24 | Shayla Byington | Bräcke | Suède |
25 | Christiana Boden | Munich | Allemagne |
26 | Irina Nitta | Nantes | France |
27 | Bryanna Alls | Torino | Italie |
28 | Norah Picken | Lisboa | le Portugal |
29 | Moriah Stwart | Barcelone | Espagne |
30 | Idella Harriott | Sevilla | Espagne |
Numéro de commande | N ° de client | Date de commande |
10254 | 14 | 11-07-1996 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | sept | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 | 12-08-1996 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | sept | 04-09-1996 |
10303 | 30 | 11-09-1996 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 10-10-1996 |
10327 | 24 | 11-10-1996 |
10328 | 28 | 14-10-1996 |
10331 | 9 | 16-10-1996 |
10337 | 25 | 24-10-1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 06-11-1996 |
10351 | 20 | 11-11-1996 |
10352 | 28 | 12-11-1996 |
10355 | 4 | 15-11-1996 |
10360 | sept | 22-11-1996 |
10362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 03-12-1996 |
10378 | 24 | 10-12-1996 |
10382 | 20 | 13-12-1996 |
10383 | 4 | 16-12-1996 |
10384 | 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | dix | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 01-01-1997 |
10402 | 20 | 02-01-1997 |
10403 | 20 | 03-01-1997 |
10408 | 23 | 08-01-1997 |
10410 | dix | 10-01-1997 |
10411 | dix | 10-01-1997 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | dix | 30-01-1997 |
10434 | 24 | 03-02-1997 |
10435 | 16 | 04-02-1997 |
10436 | sept | 05-02-1997 |
10442 | 20 | 11-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:
Pays | Nombre de commandes |
L'Autriche | dix |
France | 9 |
Suède | sept |
Allemagne | 6 |
Royaume-Uni | 6 |
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 -
- Requête d'insertion SQL
- Clé étrangère en SQL
- Mot clé distinct dans SQL
- Vues SQL
- Top 6 des exemples de requêtes de jointure interne dans Oracle