I denne artikel vil vi lære om HAVING-sætningskonceptet og hvordan man bruger det i SQL.
Hvad er HAVING-sætningen?
I Structured Query Language angiver HAVING-klausulen brugt med GROUP BY-klausul de betingelser, der filtrerer resultaterne, der vises i outputtet. Det returnerer kun de data fra gruppen, som opfylder betingelserne.
Med HAVING-sætningen kan vi også bruge WHERE-sætningen i forespørgslen. Hvis vi bruger begge klausuler sammen, vil WHERE-klausulen blive eksekveret først, hvor den vil filtrere de individuelle rækker, derefter grupperes rækker, og i slutningen filtrerer HAVING-klausulen grupperne.
HAVING-klausulens betingelser er placeret efter GROUP BY-klausulen. HAVING-sætningen opførte sig på samme måde som WHERE-sætningen i Structured Query Language bruger ikke GROUP BY-sætningen. Vi kan bruge aggregerede funktioner såsom MIN, MAX, SUM, AVG og COUNT. Denne funktion bruges kun sammen med SELECT-sætningen og HAVING-sætningen.
Syntaks for HAVING-sætning:
SELECT COLUMNS, AGGREGATE FUNCTION, FROM TABLENAME WHERE CONDITION GROUP BY COLUMN HAVING CONDITIONS;
Der er nogle trin, vi skal lære, for at bruge HAVING-sætningen i SQL-forespørgslen:
1. Opret en ny database, eller brug en eksisterende database ved at vælge databasen ved at bruge nøgleordet USE efterfulgt af databasenavnet.
2. Opret en ny tabel i den valgte database, eller du kan bruge en allerede oprettet tabel.
3. Hvis tabellen er oprettet ny, skal du indsætte posterne i den nyoprettede database ved hjælp af INSERT-forespørgslen og se de indsatte data ved hjælp af SELECT-forespørgslen uden HAVING-sætningen.
4. Nu er vi klar til at bruge HAVING-sætningen i SQL-forespørgslerne.
Trin 1:Opret en ny database, eller brug en allerede oprettet database.
Jeg har allerede oprettet en database. Jeg vil bruge mit eksisterende oprettede databasenavn.
USE SCHOOL;
Skole er databasenavnet.
De, der ikke har oprettet en database, skal du følge nedenstående forespørgsel for at oprette databasen:
CREATE DATABASE database_name;
Når du har oprettet databasen, skal du vælge databasen med nøgleordet USE efterfulgt af databasenavnet.
Trin 2:Opret en ny tabel, eller brug allerede eksisterende tabel:
Jeg har allerede lavet en tabel. Jeg vil bruge den eksisterende tabel med navnet Student.
Følg nedenstående CREATE TABLE syntaks for at oprette de nye tabeller:
CREATE TABLE table_name(
columnname1 datatype(column size),
columnname2 datatype(column size),
columnname3 datatype(column size)
);
Trin 3:Indsæt posterne i den nyoprettede tabel ved hjælp af INSERT-forespørgslen, og se posterne ved hjælp af SELECT-forespørgslen.
Brug nedenstående syntaks til at indsætte nye poster i tabellen:
INSERT INTO table_name VALUES(value1, value2, value3);
For at se posterne fra tabellen ved hjælp af nedenstående syntaks:
SELECT * FROM table_name;
Følgende forespørgsel viser medarbejdernes optegnelser
SELECT * FROM Student;
Outputtet af ovenstående SELECT-forespørgsel er:
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 |
Trin 4:Vi er klar til at bruge HAVING-sætningen i Structured Query Language.
Vi vil nu tage et dybt dyk ned i HAVING-sætningen ved hjælp af eksempler.
Vi har en tabel ved navn Student, der indeholder følgende poster.
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 |
Eksempel 1: Skriv en forespørgsel for at vise summen af fysikkarakterer, hvor summen af fysikkarakterer er større end 60 grupper efter elev-id.
SELECT STUDENT_ID, STUDENT_NAME, SUM(PHYSICS_MARKS) AS PHYSICS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING SUM(PHYSICS_MARKS) > 60;
I ovenstående forespørgsel har vi taget en aggregeret funktion ved navn SUM() efterfulgt af kolonnenavn physics_marks, som vil summere kolonnen. Først bliver Sum(physics_marks) eksekveret, derefter udføres HAVING-sætningsbetingelsen til sidst, og det endelige resultat vil blive vist. Vi har brugt GROUP BY-sætningen efterfulgt af kolonnenavnet Student_Id til at gruppere de samme værdier og betragte dem som én gruppe. Hvis værdierne ikke er de samme, vil der ikke blive dannet en gruppe for værdier. Og til sidst har vi brugt HAVING-sætningen, hvor vi sætter betingelsen, der hjælper med at vise kun de elevoplysninger, hvor summen af fysikkarakterer er større end 60. Hvis elevernes fysikkarakterer er mindre end 60, vil den ikke vise optegnelser.
Outputtet af ovenstående forespørgsel er:
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 |
Som vi kan se i outputtet, vises kun de elev-id'er, navne og fysikmærker, hvor summen af fysikkarakterer er større end 60. Da vi brugte GROUP BY-sætning, og ingen værdier er ens, tælles de som en enkelt gruppe .
Eksempel 2: Skriv en forespørgsel for at vise de maksimale karakterer for kemikarakterer, hvor en maksimal karakter af kemikarakterer er mindre end 90 grupper efter elev-id.
SELECT STUDENT_ID, STUDENT_NAME, MAX(CHEMISTRY_MARKS) AS CHEMISTRY_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MAX(CHEMISTRY_MARKS) < 90;
I ovenstående forespørgsel har vi taget en aggregeret funktion ved navn MAX() efterfulgt af kolonnenavn chemistry_marks, som vil finde de maksimale markeringer for kolonnen. Vi har brugt GROUP BY-sætningen efterfulgt af kolonnenavnet Student_Id til at gruppere de samme værdier og betragte dem som én gruppe. Hvis værdierne ikke er de samme, vil der blive dannet en separat gruppe for værdier. Og til sidst har vi brugt HAVING-klausulen, hvor vi sætter betingelsen, der hjælper med at vise kun de elevoplysninger, hvor det maksimale antal kemikarakterer er mindre end 90. Hvis elevernes kemikarakterer er større end 90, vil det ikke vise optegnelserne. Først bliver MAX(kemi_mærker) eksekveret, derefter udføres HAVING-sætningsbetingelsen til sidst, og det endelige resultat vil blive vist. Outputtet af ovenstående forespørgsel er:
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 |
Som vi kan se i outputtet, vises kun de elev-id'er, navne og kemimærker, hvor det maksimale antal kemimærker er mindre end 90. Da vi brugte GROUP BY-sætning, og ingen værdier er ens, tælles de som en enkelt gruppe.
Eksempel 3: Skriv en forespørgsel for at vise matematikkaraktererne, hvor et minimumskarakter af matematikkarakterer er større end 70 grupper efter elev-id.
SELECT STUDENT_ID, STUDENT_NAME, MIN(MATHS_MARKS) AS MATHS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MIN(MATHS_MARKS) >70;
I ovenstående forespørgsel har vi taget en aggregeret funktion ved navn MIN() efterfulgt af kolonnenavn maths_marks, som vil finde minimumsmærkerne for kolonnen. Vi har brugt GROUP BY-sætningen efterfulgt af kolonnenavnet Student_Id til at gruppere de samme værdier og betragte dem som én gruppe. Hvis værdierne ikke er de samme, vil der blive dannet en separat gruppe for værdier. Og til sidst har vi brugt HAVING-klausulen, hvor vi sætter betingelsen, der hjælper med at vise kun de elevoplysninger, hvor minimumskarakteren for matematikkarakterer er større end 70. Hvis elevens matematikkarakterer er mindre end 70, vil den ikke vise optegnelserne. Først bliver MIN(maths_marks) eksekveret, derefter udføres HAVING-sætningsbetingelsen til sidst, og det endelige resultat vil blive vist.
Outputtet fra ovenstående forespørgsel er:
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 |
Som vi kan se i outputtet, vises kun de elev-id'er, navne og matematiske karakterer, hvor minimumskarakteren for matematiske karakterer er større end 70. Da vi brugte GROUP BY-sætning, og ingen værdier er ens, tælles de som en enkelt gruppe.
Eksempel 4: Skriv en forespørgsel for at vise elevoplysninger, hvor minimumskarakterer i fysik er større end 56, OG maksimale matematikkarakterer er mindre end 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;
Vi brugte dobbelte aggregerede funktioner i en enkelt forespørgsel min() og max() i ovenstående forespørgsel. Min() bruges til at finde ud af fysikkens minimumskarakterer, og Max() bruges til at finde ud af de maksimale matematiske karakterer. Først vil forespørgslen finde min() og max() karaktererne for fysik og matematik fra elevtabellen. Som vi brugte GROUP BY-sætning, så lignende værdier kortlagt som én gruppe, ellers vil værdier være som adskilte. Da ingen værdier er ens i tabellen, er alle værdier adskilt. Ingen værdier vil blive kortlagt som én gruppe. Dernæst brugte vi HAVING-klausulen, som fungerer som WHERE-klausulforskel kun HAVING-klausulen mappet ind i gruppen. For det første er betingelsen MIN(PHYSICS_MARKS)> 58. Da ingen værdier er ens, vil hver værdi blive betragtet som minimumsværdi, og sammenlignet med betingelsen bruges den samme tilgang til MAX(MATHS_MARKS). Da vi brugte AND-operatoren i forespørgslen, opfylder disse betingelser begge betingelser. Kun disse elevers optegnelser vises i det endelige output.
Outputtet af ovenstående forespørgsel er:
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 |
Som vi kan se i outputtet, vises kun de elevposter, hvor minimumskarakterer for fysikværdier er større end 56, OG maksimale matematiske karakterer er mindre end 98.
I ovenstående eksempel, hvis der bruges OR-operator i stedet for AND-operator, vises alle de ti poster, fordi OR-operatoren siger, at hvis én betingelse fejler, og andre betingelser er sande, så opfylder tabelposter betingelserne.