sql >> Databasteknik >  >> RDS >> Database

Hur man använder HAVING-satsen i SQL

I den här artikeln kommer vi att lära oss om HAVING-satskonceptet och hur man använder det i SQL.

Vad är HAVING-satsen?

I Structured Query Language anger HAVING-satsen som används med GROUP BY-satsen villkoren som filtrerar resultaten som visas i utdata. Den returnerar endast de data från gruppen som uppfyller villkoren.

Med HAVING-satsen kan vi använda WHERE-satsen även i frågan. Om vi ​​använder båda satserna tillsammans, kommer WHERE-satsen att exekveras först där den filtrerar de individuella raderna, sedan grupperas raderna och i slutet filtrerar HAVING-satsen grupperna.

Villkoren för HAVING-satsen placeras efter GROUP BY-satsen. HAVING-satsen uppförde sig på samma sätt som WHERE-satsen i Structured Query Language använder inte GROUP BY-satsen. Vi kan använda aggregerade funktioner som MIN, MAX, SUM, AVG och COUNT. Denna funktion används endast med SELECT-satsen och HAVING-satsen.

Syntax för HAVING-satsen:

SELECT COLUMNS, AGGREGATE FUNCTION, FROM TABLENAME WHERE CONDITION GROUP BY COLUMN HAVING CONDITIONS; 

Det finns några steg vi måste lära oss för hur man använder HAVING-satsen i SQL-frågan:

1. Skapa en ny databas eller använd en befintlig databas genom att välja databasen med nyckelordet USE följt av databasnamnet.

2. Skapa en ny tabell i den valda databasen, eller så kan du använda en redan skapad tabell.

3. Om tabellen skapas ny, infoga posterna i den nyskapade databasen med INSERT-frågan och visa infogade data med SELECT-frågan utan HAVING-satsen.

4. Nu är vi redo att använda HAVING-satsen i SQL-frågorna.

Steg 1:Skapa en ny databas eller använd en redan skapad databas.

Jag har redan skapat en databas. Jag kommer att använda mitt befintliga skapade databasnamn.

USE SCHOOL;

Skola är databasnamnet.

De som inte har skapat en databas, följ frågan nedan för att skapa databasen:

CREATE DATABASE database_name;

När du har skapat databasen väljer du databasen med hjälp av nyckelordet USE följt av databasens namn.

Steg 2:Skapa en ny tabell eller använd redan befintlig tabell:

Jag har redan skapat en tabell. Jag kommer att använda den befintliga tabellen som heter Student.

Följ syntaxen CREATE TABLE nedan för att skapa de nya tabellerna:

CREATE TABLE table_name(

columnname1 datatype(column size),

columnname2 datatype(column size),

columnname3 datatype(column size)

);

Steg 3:Infoga posterna i den nyskapade tabellen med INSERT-frågan och visa posterna med SELECT-frågan.

Använd nedanstående syntax för att infoga nya poster i tabellen:

INSERT INTO table_name VALUES(value1, value2, value3);

Så här visar du posterna från tabellen med syntaxen nedan:

SELECT * FROM table_name;

Följande fråga kommer att visa uppgifter om anställda

SELECT * FROM Student;

Utdata från ovanstående SELECT-fråga är:

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

Steg 4:Vi är redo att använda HAVING-satsen i Structured Query Language.

Vi kommer nu att göra en djupdykning i HAVING-satsen med hjälp av exempel.

Vi har en tabell som heter Student som innehåller följande 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

Exempel 1: Skriv en fråga för att visa summan av fysikbetyg där summan av fysikbetyg är större än 60 grupper efter student-id.

SELECT STUDENT_ID, STUDENT_NAME, SUM(PHYSICS_MARKS) AS PHYSICS_MARKS FROM STUDENT GROUP BY STUDENT_ID  HAVING SUM(PHYSICS_MARKS) > 60;

I ovanstående fråga har vi tagit en aggregatfunktion som heter SUM() följt av kolumnnamnet physics_marks, som kommer att summera kolumnen. Först exekveras Sum(physics_marks), sedan exekveras HAVING-satsvillkoret i slutet, och det slutliga resultatet kommer att visas. Vi har använt GROUP BY-satsen följt av kolumnnamnet Student_Id för att gruppera samma värden och betrakta dem som en grupp. Om värdena inte är desamma kommer ingen grupp att bildas för värden. Och i slutet har vi använt HAVING-satsen där vi sätter villkoret som hjälper till att visa endast de elevdetaljer där summan av fysikbetyg är större än 60. Om elevernas fysikbetyg är mindre än 60, kommer den inte att visa rekord.

Utdata från ovanstående fråga är:

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 utdata visas endast de student-ID, namn och fysikbetyg där summan av fysikbetyg är större än 60. Eftersom vi använde GROUP BY-sats och inga värden är lika, räknas de som en enda grupp .

Exempel 2: Skriv en fråga för att visa det maximala antalet kemibetyg där det maximala antalet kemibetyg är mindre än 90 grupper efter student-id.

SELECT STUDENT_ID, STUDENT_NAME, MAX(CHEMISTRY_MARKS) AS CHEMISTRY_MARKS FROM STUDENT GROUP BY STUDENT_ID  HAVING MAX(CHEMISTRY_MARKS) < 90;  

I ovanstående fråga har vi tagit en aggregatfunktion som heter MAX() följt av kolumnnamnet kemi_märken, som kommer att hitta de maximala poängen för kolumnen. Vi har använt GROUP BY-satsen följt av kolumnnamnet Student_Id för att gruppera samma värden och betrakta dem som en grupp. Om värdena inte är desamma, kommer en separat grupp att bildas för värden. Och i slutet har vi använt HAVING-satsen där vi sätter villkoret som hjälper till att visa endast de studentuppgifter där det maximala antalet kemibetyg är mindre än 90. Om elevens kemibetyg är större än 90, kommer det inte att visa journalerna. Först exekveras MAX(kemi_märken), sedan körs HAVING-satsvillkoret i slutet och det slutliga resultatet kommer att visas. Utdata från ovanstående fråga är:

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 resultatet visas endast de student-ID, namn och kemimärken där det maximala antalet kemibetyg är mindre än 90. Eftersom vi använde GROUP BY-sats och inga värden är lika, räknas de som en enda grupp.

Exempel 3: Skriv en fråga för att visa matematikbetygen där ett lägsta antal matematikbetyg är större än 70 grupper efter student-id.

SELECT STUDENT_ID, STUDENT_NAME, MIN(MATHS_MARKS) AS MATHS_MARKS FROM STUDENT GROUP BY STUDENT_ID  HAVING MIN(MATHS_MARKS) >70;

I ovanstående fråga har vi tagit en aggregerad funktion som heter MIN() följt av kolumnnamnet maths_marks, som kommer att hitta minsta poäng för kolumnen. Vi har använt GROUP BY-satsen följt av kolumnnamnet Student_Id för att gruppera samma värden och betrakta dem som en grupp. Om värdena inte är desamma, kommer en separat grupp att bildas för värden. Och i slutet har vi använt HAVING-satsen där vi sätter villkoret som hjälper till att visa endast de elevuppgifter där minimibetyget för matematikbetyg är större än 70. Om studentens matematikbetyg är mindre än 70, kommer det inte att visa journalerna. Först exekveras MIN(maths_marks), sedan exekveras HAVING-satsvillkoret i slutet, och det slutliga resultatet kommer att visas.

Utdata från ovanstående fråga är:

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 resultatet visas endast de elev-ID, namn och matematikbetyg där minimibetyget för matematikbetyg är större än 70. Eftersom vi använde GROUP BY-sats och inga värden är lika, räknas de som en enda grupp.

Exempel 4: Skriv en fråga för att visa elevinformation där minsta fysikbetyg är större än 56, OCH maximala matematikbetyg är mindre än 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 använde dubbla aggregerade funktioner i en enda fråga min() och max() i ovanstående fråga. Min() används för att ta reda på minimumbetygen för fysik, och Max() används för att ta reda på de maximala matematiska poängen. Först hittar frågan min() och max()-betygen för fysik och matematik från elevtabellen. Som vi använde GROUP BY-sats, så liknande värden mappas som en grupp, annars kommer värden att vara separerade. Eftersom inga värden är lika i tabellen har alla värden separerats. Inga värden kommer att mappas som en grupp. Därefter använde vi HAVING-satsen, som fungerar som WHERE-satsskillnad endast HAVING-satsen mappad in i gruppen. För det första är villkoret MIN(PHYSICS_MARKS)> 58. Eftersom inga värden är lika, kommer varje värde att betraktas som ett minimivärde, och jämfört med villkoret används samma tillvägagångssätt för MAX(MATHS_MARKS). Eftersom vi använde AND-operatorn i frågan, uppfyller dessa villkor båda villkoren. Endast dessa elevers poster visas i slutresultatet.

Utdata från ovanstående fråga är:

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 utgången visas endast de studentposter där minsta poäng för fysikvärden är större än 56 och maximala matematiska poäng är mindre än 98.

I exemplet ovan, om den används OR-operator istället för AND-operator, visas alla de tio posterna eftersom OR-operatorn säger att om ett villkor misslyckas och andra villkor är sanna, så uppfyller tabellposter villkoren.


  1. Vad är skillnaden mellan att använda INDEX vs KEY i MySQL?

  2. Välj värden som uppfyller olika villkor på olika rader?

  3. MariaDB SYSTEM_USER() Förklarad

  4. Tuning SQL