Dans cet article, nous allons découvrir le concept de clause HAVING et comment l'utiliser en SQL.
Qu'est-ce que la clause HAVING ?
Dans le langage de requête structuré, la clause HAVING utilisée avec la clause GROUP BY spécifie les conditions qui filtrent les résultats apparaissant dans la sortie. Il renvoie uniquement les données du groupe qui remplissent les conditions.
Avec la clause HAVING, nous pouvons également utiliser la clause WHERE dans la requête. Si nous utilisons les deux clauses ensemble, la clause WHERE sera exécutée en premier où elle filtrera les lignes individuelles, puis les lignes sont regroupées et à la fin, la clause HAVING filtre les groupes.
Les conditions de la clause HAVING sont placées après la clause GROUP BY. La clause HAVING se comporte de la même manière que la clause WHERE dans le langage de requête structuré n'utilise pas la clause GROUP BY. Nous pouvons utiliser des fonctions d'agrégation telles que MIN, MAX, SUM, AVG et COUNT. Cette fonction n'est utilisée qu'avec la clause SELECT et la clause HAVING.
Syntaxe de la clause HAVING :
SELECT COLUMNS, AGGREGATE FUNCTION, FROM TABLENAME WHERE CONDITION GROUP BY COLUMN HAVING CONDITIONS;
Il y a quelques étapes que nous devons apprendre pour utiliser la clause HAVING dans la requête SQL :
1. Créez une nouvelle base de données ou utilisez une base de données existante en sélectionnant la base de données à l'aide du mot-clé USE suivi du nom de la base de données.
2. Créez une nouvelle table dans la base de données sélectionnée, ou vous pouvez utiliser une table déjà créée.
3. Si la table est créée, insérez les enregistrements dans la base de données nouvellement créée à l'aide de la requête INSERT et affichez les données insérées à l'aide de la requête SELECT sans la clause HAVING.
4. Nous sommes maintenant prêts à utiliser la clause HAVING dans les requêtes SQL.
Étape 1 :Créez une nouvelle base de données ou utilisez une base de données déjà créée.
J'ai déjà créé une base de données. J'utiliserai le nom de ma base de données créée existante.
USE SCHOOL;
L'école est le nom de la base de données.
Ceux qui n'ont pas créé de base de données, suivez la requête ci-dessous pour créer la base de données :
CREATE DATABASE database_name;
Après avoir créé la base de données, sélectionnez la base de données en utilisant le mot-clé USE suivi du nom de la base de données.
Étape 2 :Créez un nouveau tableau ou utilisez un tableau déjà existant :
J'ai déjà créé un tableau. J'utiliserai la table existante nommée Student.
Pour créer les nouvelles tables, suivez la syntaxe CREATE TABLE ci-dessous :
CREATE TABLE table_name(
columnname1 datatype(column size),
columnname2 datatype(column size),
columnname3 datatype(column size)
);
Étape 3 :Insérez les enregistrements dans la table nouvellement créée à l'aide de la requête INSERT et affichez les enregistrements à l'aide de la requête SELECT.
Utilisez la syntaxe ci-dessous pour insérer de nouveaux enregistrements dans le tableau :
INSERT INTO table_name VALUES(value1, value2, value3);
Pour afficher les enregistrements du tableau en utilisant la syntaxe ci-dessous :
SELECT * FROM table_name;
La requête suivante affichera les enregistrements des Employés
SELECT * FROM Student;
Le résultat de la requête SELECT ci-dessus est :
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS | CHEMISTRY_MARKS | MATHS_MARKS | TOTAL_MARKS |
1 | NEHA | 85 | 88 | 100 | 273 |
2 | VISHAL | 70 | 90 | 82 | 242 |
3 | SAMKEET | 75 | 88 | 96 | 259 |
4 | NIKHIL | 60 | 75 | 80 | 215 |
5 | YOGESH | 56 | 65 | 78 | 199 |
6 | ANKITA | 95 | 85 | 96 | 276 |
7 | SONAM | 98 | 89 | 100 | 287 |
8 | VINEET | 85 | 90 | 100 | 275 |
9 | SANKET | 86 | 78 | 65 | 229 |
10 | PRACHI | 90 | 80 | 75 | 245 |
Étape 4 :Nous sommes prêts à utiliser la clause HAVING dans le langage de requête structuré.
Nous allons maintenant approfondir la clause HAVING à l'aide d'exemples.
Nous avons une table nommée Student qui contient les enregistrements suivants.
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS | CHEMISTRY_MARKS | MATHS_MARKS | TOTAL_MARKS |
1 | NEHA | 85 | 88 | 100 | 273 |
2 | VISHAL | 70 | 90 | 82 | 242 |
3 | SAMKEET | 75 | 88 | 96 | 259 |
4 | NIKHIL | 60 | 75 | 80 | 215 |
5 | YOGESH | 56 | 65 | 78 | 199 |
6 | ANKITA | 95 | 85 | 96 | 276 |
7 | SONAM | 98 | 89 | 100 | 287 |
8 | VINEET | 85 | 90 | 100 | 275 |
9 | SANKET | 86 | 78 | 65 | 229 |
10 | PRACHI | 90 | 80 | 75 | 245 |
Exemple 1 : Écrivez une requête pour afficher la somme des notes de physique lorsque la somme des notes de physique est supérieure à 60 groupes par identifiant d'étudiant.
SELECT STUDENT_ID, STUDENT_NAME, SUM(PHYSICS_MARKS) AS PHYSICS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING SUM(PHYSICS_MARKS) > 60;
Dans la requête ci-dessus, nous avons pris une fonction d'agrégation nommée SUM() suivie du nom de colonne physics_marks, qui additionnera la colonne. D'abord Sum(physics_marks) est exécuté, puis la condition de la clause HAVING est exécutée à la fin, et le résultat final sera affiché. Nous avons utilisé la clause GROUP BY suivie du nom de colonne Student_Id pour regrouper les mêmes valeurs et les considérer comme un groupe. Si les valeurs ne sont pas les mêmes, aucun groupe ne sera formé pour les valeurs. Et à la fin, nous avons utilisé la clause HAVING où nous avons mis la condition qui aidera à afficher uniquement les détails des étudiants où la somme des notes de physique est supérieure à 60. Si les notes de physique des étudiants sont inférieures à 60, il n'affichera pas le enregistrements.
Le résultat de la requête ci-dessus est :
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS |
1 | NEHA | 85 |
2 | VISHAL | 70 |
3 | SAMKEET | 75 |
6 | ANKITA | 95 |
7 | SONAM | 98 |
8 | VINEET | 85 |
9 | SANKET | 86 |
10 | PRACHI | 90 |
Comme nous pouvons le voir dans la sortie, seuls les identifiants, noms et notes de physique des étudiants sont affichés là où la somme des notes de physique est supérieure à 60. Comme nous avons utilisé la clause GROUP BY et qu'aucune valeur n'est similaire, ils sont comptés comme un seul groupe .
Exemple 2 : Rédigez une requête pour afficher les notes maximales des notes de chimie lorsqu'une note maximale des notes de chimie est inférieure à 90 groupes par identifiant d'étudiant.
SELECT STUDENT_ID, STUDENT_NAME, MAX(CHEMISTRY_MARKS) AS CHEMISTRY_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MAX(CHEMISTRY_MARKS) < 90;
Dans la requête ci-dessus, nous avons pris une fonction d'agrégation nommée MAX() suivie du nom de colonne chemistry_marks, qui trouvera les marques maximales de la colonne. Nous avons utilisé la clause GROUP BY suivie du nom de colonne Student_Id pour regrouper les mêmes valeurs et les considérer comme un groupe. Si les valeurs ne sont pas les mêmes, un groupe séparé sera formé pour les valeurs. Et à la fin, nous avons utilisé la clause HAVING où nous avons mis la condition qui aidera à afficher uniquement les détails des étudiants où la note maximale des notes de chimie est inférieure à 90. Si les notes de chimie des étudiants sont supérieures à 90, cela ne sera pas afficher les enregistrements. Tout d'abord, MAX(chemistry_marks) est exécuté, puis la condition de la clause HAVING est exécutée à la fin, et le résultat final sera affiché. Le résultat de la requête ci-dessus est :
STUDENT_ID | STUDENT_NAME | CHEMISTRY_MARKS |
1 | NEHA | 88 |
3 | SAMKEET | 88 |
4 | NIKHIL | 75 |
5 | YOGESH | 65 |
6 | ANKITA | 85 |
7 | SONAM | 89 |
9 | SANKET | 78 |
10 | PRACHI | 80 |
Comme nous pouvons le voir dans la sortie, seuls les identifiants d'étudiants, les noms et les notes de chimie sont affichés là où la note maximale des notes de chimie est inférieure à 90. Comme nous avons utilisé la clause GROUP BY et qu'aucune valeur n'est similaire, elles sont comptées comme une seule groupe.
Exemple 3 : Rédigez une requête pour afficher les notes de mathématiques lorsqu'une note minimale de notes de mathématiques est supérieure à 70 groupes par identifiant d'étudiant.
SELECT STUDENT_ID, STUDENT_NAME, MIN(MATHS_MARKS) AS MATHS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MIN(MATHS_MARKS) >70;
Dans la requête ci-dessus, nous avons pris une fonction d'agrégation nommée MIN() suivie du nom de colonne maths_marks, qui trouvera les notes minimales de la colonne. Nous avons utilisé la clause GROUP BY suivie du nom de colonne Student_Id pour regrouper les mêmes valeurs et les considérer comme un groupe. Si les valeurs ne sont pas les mêmes, un groupe séparé sera formé pour les valeurs. Et à la fin, nous avons utilisé la clause HAVING où nous avons mis la condition qui aidera à afficher uniquement les détails de l'élève où la note minimale des notes en mathématiques est supérieure à 70. Si les notes en mathématiques de l'étudiant sont inférieures à 70, il ne sera pas afficher les enregistrements. Tout d'abord, MIN(maths_marks) est exécuté, puis la condition de la clause HAVING est exécutée à la fin, et le résultat final sera affiché.
Le résultat de la requête ci-dessus est :
STUDENT_ID | STUDENT_NAME | MATHS_MARKS |
1 | NEHA | 100 |
2 | VISHAL | 82 |
3 | SAMKEET | 96 |
4 | NIKHIL | 80 |
5 | YOGESH | 78 |
6 | ANKITA | 96 |
7 | SONAM | 100 |
8 | VINEET | 100 |
10 | PRACHI | 75 |
Comme nous pouvons le voir dans la sortie, seuls les identifiants, noms et notes mathématiques des étudiants sont affichés là où la note minimale des notes mathématiques est supérieure à 70. Comme nous avons utilisé la clause GROUP BY et qu'aucune valeur n'est similaire, elles sont comptées comme une seule groupe.
Exemple 4 : Rédigez une requête pour afficher les détails des élèves lorsque les notes minimales en physique sont supérieures à 56 ET que les notes maximales en mathématiques sont inférieures à 98.
SELECT STUDENT_ID, STUDENT_NAME, MIN(PHYSICS_MARKS) AS PHYSICS_MARKS , MAX(MATHS_MARKS) AS MATHS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MIN(PHYSICS_MARKS) >58 AND MAX(MATHS_MARKS)<98;
Nous avons utilisé des fonctions d'agrégation double dans une seule requête min() et max() dans la requête ci-dessus. Min() est utilisé pour connaître les notes minimales de physique et Max() est utilisé pour connaître les notes mathématiques maximales. Tout d'abord, la requête trouvera les notes min() et max() de la physique et des mathématiques à partir de la table des étudiants. Comme nous avons utilisé la clause GROUP BY, des valeurs similaires sont mappées en un seul groupe, sinon les valeurs seront aussi séparées. Comme aucune valeur n'est similaire dans le tableau, toutes les valeurs ont été séparées. Aucune valeur ne sera mappée comme un groupe. Ensuite, nous avons utilisé la clause HAVING, qui fonctionne comme la différence de clause WHERE uniquement la clause HAVING mappée dans le groupe. Premièrement, la condition est MIN(PHYSICS_MARKS)> 58. Comme aucune valeur n'est similaire, chaque valeur sera considérée comme valeur minimale, et comparée à la condition, la même approche est utilisée pour MAX(MATHS_MARKS). Comme nous avons utilisé l'opérateur AND dans la requête, ces conditions remplissent les deux conditions. Seuls les enregistrements de ces étudiants sont affichés dans la sortie finale.
Le résultat de la requête ci-dessus est :
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS | MATHS_MARKS |
2 | VISHAL | 70 | 82 |
3 | SAMKEET | 75 | 96 |
4 | NIKHIL | 60 | 80 |
6 | ANKITA | 95 | 96 |
9 | SANKET | 86 | 65 |
10 | PRACHI | 90 | 75 |
Comme nous pouvons le voir dans la sortie, seuls les enregistrements d'étudiants sont affichés où les notes minimales des valeurs de physique sont supérieures à 56, ET les notes maximales en mathématiques sont inférieures à 98.
Dans l'exemple ci-dessus, si vous utilisez l'opérateur OR au lieu de l'opérateur AND, les dix enregistrements sont affichés car l'opérateur OR indique que si une condition échoue et que d'autres conditions sont vraies, les enregistrements de table remplissent les conditions.