In dit artikel zullen we leren over het HAVING-clausuleconcept en hoe het te gebruiken in SQL.
Wat is de HAVING-clausule?
In Structured Query Language specificeert de HAVING-clausule die wordt gebruikt met de GROUP BY-clausule de voorwaarden die de resultaten filteren die in de uitvoer verschijnen. Het retourneert alleen die gegevens van de groep die aan de voorwaarden voldoen.
Met de HAVING-component kunnen we de WHERE-component ook in de query gebruiken. Als we beide clausules samen gebruiken, wordt de WHERE-clausule eerst uitgevoerd, waarbij de afzonderlijke rijen worden gefilterd, vervolgens worden de rijen gegroepeerd en aan het einde filtert de HAVING-clausule de groepen.
De voorwaarden van de HAVING-clausule worden na de GROUP BY-clausule geplaatst. De clausule HAVING gedroeg zich hetzelfde als de clausule WHERE in de Structured Query Language maakt geen gebruik van de clausule GROUP BY. We kunnen geaggregeerde functies gebruiken zoals MIN, MAX, SUM, AVG en COUNT. Deze functie wordt alleen gebruikt met de SELECT-clausule en de HAVING-clausule.
Syntaxis van HAVING-clausule:
SELECT COLUMNS, AGGREGATE FUNCTION, FROM TABLENAME WHERE CONDITION GROUP BY COLUMN HAVING CONDITIONS;
Er zijn enkele stappen die we moeten leren om de HAVING-clausule in de SQL-query te gebruiken:
1. Maak een nieuwe database of gebruik een bestaande database door de database te selecteren met het USE-sleutelwoord gevolgd door de databasenaam.
2. Maak een nieuwe tabel in de geselecteerde database, of u kunt een reeds gemaakte tabel gebruiken.
3. Als de tabel nieuw is gemaakt, voegt u de records in de nieuw gemaakte database in met behulp van de INSERT-query en bekijkt u de ingevoegde gegevens met behulp van de SELECT-query zonder de HAVING-component.
4. Nu zijn we klaar om de HAVING-component in de SQL-query's te gebruiken.
Stap 1:Maak een nieuwe database of gebruik een reeds aangemaakte database.
Ik heb al een database aangemaakt. Ik zal mijn bestaande databasenaam gebruiken.
USE SCHOOL;
School is de naam van de database.
Degenen die geen database hebben gemaakt, volgen de onderstaande vraag om de database te maken:
CREATE DATABASE database_name;
Nadat u de database hebt gemaakt, selecteert u de database met behulp van het USE-sleutelwoord gevolgd door de databasenaam.
Stap 2:Maak een nieuwe tabel of gebruik een reeds bestaande tabel:
Ik heb al een tabel gemaakt. Ik zal de bestaande tabel met de naam Student gebruiken.
Volg onderstaande CREATE TABLE syntaxis om de nieuwe tabellen te maken:
CREATE TABLE table_name(
columnname1 datatype(column size),
columnname2 datatype(column size),
columnname3 datatype(column size)
);
Stap 3:Voeg de records in de nieuw gemaakte tabel in met de INSERT-query en bekijk de records met de SELECT-query.
Gebruik onderstaande syntaxis om nieuwe records in de tabel in te voegen:
INSERT INTO table_name VALUES(value1, value2, value3);
Om de records uit de tabel te bekijken met behulp van de onderstaande syntaxis:
SELECT * FROM table_name;
De volgende zoekopdracht toont de records van werknemers
SELECT * FROM Student;
De uitvoer van de bovenstaande SELECT-query is:
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 |
Stap 4:We zijn klaar om de HAVING-clausule in de Structured Query Language te gebruiken.
We gaan nu dieper in op de HAVING-clausule met behulp van voorbeelden.
We hebben een tabel met de naam Student die de volgende records bevat.
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 |
Voorbeeld 1: Schrijf een query om de som van natuurkundecijfers weer te geven waarbij de som van natuurkundecijfers groter is dan 60 groepen per student-ID.
SELECT STUDENT_ID, STUDENT_NAME, SUM(PHYSICS_MARKS) AS PHYSICS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING SUM(PHYSICS_MARKS) > 60;
In de bovenstaande query hebben we een aggregatiefunctie genomen met de naam SUM() gevolgd door kolomnaam physics_marks, waarmee de kolom wordt opgeteld. Eerst wordt Sum(physics_marks) uitgevoerd, dan wordt de HAVING-clausulevoorwaarde aan het einde uitgevoerd, en het uiteindelijke resultaat wordt weergegeven. We hebben de GROUP BY-component gevolgd door de kolomnaam Student_Id gebruikt om dezelfde waarden te groeperen en ze als één groep te beschouwen. Als waarden niet hetzelfde zijn, wordt er geen groep gevormd voor waarden. En aan het einde hebben we de HAVING-clausule gebruikt waarin we de voorwaarde plaatsen die ervoor zorgt dat alleen die studentdetails worden weergegeven waarvan de som van de natuurkundecijfers groter is dan 60. Als de natuurkundecijfers van de student kleiner zijn dan 60, wordt de records.
De uitvoer van de bovenstaande vraag is:
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 |
Zoals we in de uitvoer kunnen zien, worden alleen die student-ID's, namen en natuurkundecijfers weergegeven waarvan de som van de natuurkundecijfers groter is dan 60. Omdat we de GROUP BY-clausule hebben gebruikt en geen waarden vergelijkbaar zijn, worden ze geteld als een enkele groep .
Voorbeeld 2: Schrijf een zoekopdracht om het maximum aantal scheikundecijfers weer te geven waarbij het maximumcijfer voor scheikunde minder dan 90 is, gegroepeerd op leerling-ID.
SELECT STUDENT_ID, STUDENT_NAME, MAX(CHEMISTRY_MARKS) AS CHEMISTRY_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MAX(CHEMISTRY_MARKS) < 90;
In de bovenstaande query hebben we een aggregatiefunctie met de naam MAX() genomen, gevolgd door kolomnaam chemistry_marks, waarmee de maximale markeringen van de kolom worden gevonden. We hebben de GROUP BY-component gevolgd door de kolomnaam Student_Id gebruikt om dezelfde waarden te groeperen en ze als één groep te beschouwen. Als waarden niet hetzelfde zijn, wordt er een aparte groep gevormd voor waarden. En aan het einde hebben we de HAVING-clausule gebruikt waar we de voorwaarde plaatsen die zal helpen om alleen die studentdetails weer te geven waarbij het maximale aantal scheikundecijfers minder dan 90 is. Als de scheikundecijfers van de student groter zijn dan 90, zal het niet de records weergeven. Eerst wordt MAX(chemistry_marks) uitgevoerd, vervolgens wordt de HAVING-clausulevoorwaarde uitgevoerd aan het einde, en het uiteindelijke resultaat wordt weergegeven. De uitvoer van de bovenstaande vraag is:
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 |
Zoals we in de uitvoer kunnen zien, worden alleen die student-ID's, namen en scheikundecijfers weergegeven waarbij het maximale aantal scheikundecijfers minder is dan 90. Omdat we de GROUP BY-clausule hebben gebruikt en geen enkele waarde vergelijkbaar is, worden ze geteld als een enkele groep.
Voorbeeld 3: Schrijf een query om de wiskundecijfers weer te geven waarbij een minimumcijfer voor wiskundecijfers groter is dan 70 groepen per student-ID.
SELECT STUDENT_ID, STUDENT_NAME, MIN(MATHS_MARKS) AS MATHS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MIN(MATHS_MARKS) >70;
In de bovenstaande query hebben we een aggregatiefunctie met de naam MIN() genomen, gevolgd door kolomnaam maths_marks, waarmee de minimummarkeringen van de kolom worden gevonden. We hebben de GROUP BY-component gevolgd door de kolomnaam Student_Id gebruikt om dezelfde waarden te groeperen en ze als één groep te beschouwen. Als waarden niet hetzelfde zijn, wordt er een aparte groep gevormd voor waarden. En aan het einde hebben we de HAVING-clausule gebruikt waar we de voorwaarde plaatsen die zal helpen om alleen die studentdetails weer te geven waarbij het minimumcijfer voor wiskundecijfers groter is dan 70. Als de wiskundecijfers van de student lager zijn dan 70, zal het niet de records weergeven. Eerst wordt MIN(maths_marks) uitgevoerd, vervolgens wordt aan het einde de voorwaarde van de HAVING-clausule uitgevoerd en wordt het uiteindelijke resultaat weergegeven.
De uitvoer van de bovenstaande zoekopdracht is:
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 |
Zoals we in de uitvoer kunnen zien, worden alleen die leerling-ID's, namen en rekentekens weergegeven waarbij het minimumcijfer voor rekentekens groter is dan 70. Omdat we de GROUP BY-clausule hebben gebruikt en geen enkele waarde vergelijkbaar is, worden ze geteld als een enkele groep.
Voorbeeld 4: Schrijf een zoekopdracht om leerlingdetails weer te geven waarbij het minimum natuurkundecijfer hoger is dan 56 EN het maximum wiskundecijfer lager is dan 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;
We gebruikten dubbele statistische functies in een enkele query min() en max() in de bovenstaande query. Min() wordt gebruikt om de minimale cijfers voor natuurkunde te achterhalen en Max() wordt gebruikt om de maximale wiskundige cijfers te achterhalen. Eerst vindt de query de min() en max() cijfers van natuurkunde en wiskunde uit de leerlingentabel. Omdat we de GROUP BY-clausule hebben gebruikt, worden vergelijkbare waarden als één groep toegewezen, anders zijn de waarden gescheiden. Omdat er geen waarden vergelijkbaar zijn in de tabel, zijn alle waarden gescheiden. Er worden geen waarden toegewezen als één groep. Vervolgens gebruikten we de HAVING-component, die werkt als een WHERE-componentverschil, alleen de HAVING-component die in de groep is toegewezen. Ten eerste is de voorwaarde MIN(PHYSICS_MARKS)> 58. Aangezien geen enkele waarde gelijk is, wordt elke waarde als een minimumwaarde beschouwd en vergeleken met de voorwaarde wordt dezelfde benadering gebruikt voor MAX(MATHS_MARKS). Omdat we de operator AND in de query hebben gebruikt, voldoen die voorwaarden aan beide voorwaarden. Alleen de records van die studenten worden weergegeven in de uiteindelijke uitvoer.
De uitvoer van de bovenstaande vraag is:
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 |
Zoals we in de uitvoer kunnen zien, worden alleen die studentenrecords weergegeven waar de minimumcijfers voor natuurkundewaarden groter zijn dan 56, EN de maximumcijfers voor wiskunde lager zijn dan 98.
Als in het bovenstaande voorbeeld de OR-operator wordt gebruikt in plaats van de AND-operator, worden alle tien records weergegeven, omdat de OR-operator zegt dat als één voorwaarde faalt en andere voorwaarden waar zijn, tabelrecords aan de voorwaarden voldoen.