sql >> Databáze >  >> RDS >> Database

Jak používat klauzuli HAVING v SQL

V tomto článku se dozvíme o konceptu klauzule HAVING a o tom, jak ji používat v SQL.

Co je klauzule HAVING?

Ve strukturovaném dotazovacím jazyce klauzule HAVING používaná s klauzulí GROUP BY určuje podmínky, které filtrují výsledky zobrazené ve výstupu. Vrací pouze ta data ze skupiny, která splňuje podmínky.

S klauzulí HAVING můžeme v dotazu použít klauzuli WHERE. Pokud použijeme obě klauzule společně, nejprve se provede klauzule WHERE, kde se budou filtrovat jednotlivé řádky, pak se řádky seskupí a na konci klauzule HAVING filtruje skupiny.

Podmínky klauzule HAVING jsou umístěny za klauzuli GROUP BY. Klauzule HAVING se chovala stejně jako klauzule WHERE v jazyce Structured Query Language nepoužívá klauzuli GROUP BY. Můžeme použít agregační funkce jako MIN, MAX, SUM, AVG a COUNT. Tato funkce se používá pouze s klauzulí SELECT a klauzulí HAVING.

Syntaxe klauzule HAVING:

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

Existuje několik kroků, které se musíme naučit, jak používat klauzuli HAVING v dotazu SQL:

1. Vytvořte novou databázi nebo použijte existující databázi výběrem databáze pomocí klíčového slova USE následovaného názvem databáze.

2. Vytvořte novou tabulku ve vybrané databázi nebo můžete použít již vytvořenou tabulku.

3. Pokud je tabulka vytvořena nová, vložte záznamy do nově vytvořené databáze pomocí dotazu INSERT a prohlédněte si vložená data pomocí dotazu SELECT bez klauzule HAVING.

4. Nyní jsme připraveni použít klauzuli HAVING v dotazech SQL.

Krok 1:Vytvořte novou databázi nebo použijte již vytvořenou databázi.

Již jsem vytvořil databázi. Použiji svůj existující vytvořený název databáze.

USE SCHOOL;

Škola je název databáze.

Ti, kteří si databázi nevytvořili, vytvořte databázi podle následujícího dotazu:

CREATE DATABASE database_name;

Po vytvoření databáze vyberte databázi pomocí klíčového slova USE následovaného názvem databáze.

Krok 2:Vytvořte novou tabulku nebo použijte již existující tabulku:

Již jsem vytvořil tabulku. Použiji existující tabulku s názvem Student.

Chcete-li vytvořit nové tabulky, postupujte podle syntaxe CREATE TABLE:

CREATE TABLE table_name(

columnname1 datatype(column size),

columnname2 datatype(column size),

columnname3 datatype(column size)

);

Krok 3:Vložte záznamy do nově vytvořené tabulky pomocí dotazu INSERT a zobrazte záznamy pomocí dotazu SELECT.

Pro vložení nových záznamů do tabulky použijte níže uvedenou syntaxi:

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

Chcete-li zobrazit záznamy z tabulky pomocí níže uvedené syntaxe:

SELECT * FROM table_name;

Následující dotaz zobrazí záznamy Zaměstnanci

SELECT * FROM Student;

Výstup výše uvedeného dotazu SELECT je:

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

Krok 4:Jsme připraveni použít klauzuli HAVING ve strukturovaném dotazovacím jazyce.

Nyní se hluboce ponoříme do klauzule HAVING pomocí příkladů.

Máme tabulku s názvem Student, která obsahuje následující záznamy.

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

Příklad 1: Napište dotaz pro zobrazení součtu známek z fyziky, kde je součet známek z fyziky větší než 60 skupin podle ID studenta.

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

Ve výše uvedeném dotazu jsme vzali agregační funkci s názvem SUM() následovanou názvem sloupce Physical_marks, která bude sčítat sloupec. Nejprve se provede Sum(physics_marks), pak se na konci provede podmínka klauzule HAVING a zobrazí se konečný výsledek. Použili jsme klauzuli GROUP BY následovanou názvem sloupce Student_Id k seskupení stejných hodnot a považovali je za jednu skupinu. Pokud hodnoty nejsou stejné, nevytvoří se pro hodnoty žádná skupina. A na konci jsme použili klauzuli HAVING, kde jsme vložili podmínku, která pomůže zobrazit pouze ty detaily studenta, kde je součet známek z fyziky větší než 60. Pokud jsou známky z fyziky nižší než 60, nezobrazí se záznamy.

Výstup výše uvedeného dotazu je:

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

Jak můžeme vidět na výstupu, zobrazí se pouze ta ID studentů, jména a známky z fyziky, kde je součet známek z fyziky větší než 60. Protože jsme použili klauzuli GROUP BY a žádné hodnoty nejsou podobné, počítají se jako jedna skupina .

Příklad 2: Napište dotaz pro zobrazení maximálního počtu známek z chemie, pokud je maximální počet známek z chemie menší než 90 skupin podle ID studenta.

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

Ve výše uvedeném dotazu jsme vzali agregační funkci s názvem MAX() následovanou názvem sloupce chemistry_marks, která najde maximální počet značek ve sloupci. Použili jsme klauzuli GROUP BY následovanou názvem sloupce Student_Id k seskupení stejných hodnot a považovali je za jednu skupinu. Pokud hodnoty nejsou stejné, vytvoří se pro hodnoty samostatná skupina. A na konci jsme použili klauzuli HAVING, kde jsme umístili podmínku, která pomůže zobrazit pouze ty detaily studenta, kde je maximální známka z chemie nižší než 90. Pokud jsou známky z chemie vyšší než 90, nebude zobrazit záznamy. Nejprve se provede MAX(chemistry_marks), pak se na konci provede podmínka klauzule HAVING a zobrazí se konečný výsledek. Výstup výše uvedeného dotazu je:

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

Jak můžeme vidět na výstupu, zobrazí se pouze ta ID studentů, jména a známky z chemie, kde je maximální známka z chemie menší než 90. Protože jsme použili klauzuli GROUP BY a žádné hodnoty nejsou podobné, počítají se jako jedna skupina.

Příklad 3: Napište dotaz, který zobrazí známky z matematiky, pokud je minimální počet známek z matematiky větší než 70 skupin podle ID studenta.

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

Ve výše uvedeném dotazu jsme vzali agregační funkci s názvem MIN() následovanou názvem sloupce maths_marks, která najde minimální značky sloupce. Použili jsme klauzuli GROUP BY následovanou názvem sloupce Student_Id k seskupení stejných hodnot a považovali je za jednu skupinu. Pokud hodnoty nejsou stejné, vytvoří se pro hodnoty samostatná skupina. A na konec jsme použili klauzuli HAVING, kde jsme vložili podmínku, která pomůže zobrazit pouze ty detaily studenta, kde je minimální známka z matematiky větší než 70. Pokud jsou známky z matematiky nižší než 70, nebude zobrazit záznamy. Nejprve se vykoná MIN(maths_marks), poté se na konci provede podmínka klauzule HAVING a zobrazí se konečný výsledek.

Výstup výše uvedeného dotazu je:

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

Jak můžeme vidět na výstupu, zobrazí se pouze ta ID studentů, jména a známky z matematiky, kde je minimální známka z matematiky větší než 70. Protože jsme použili klauzuli GROUP BY a žádné hodnoty nejsou podobné, počítají se jako jedna skupina.

Příklad 4: Napište dotaz pro zobrazení podrobností o studentovi, kde jsou minimální známky z fyziky vyšší než 56 A maximální známky z matematiky nižší než 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;

Ve výše uvedeném dotazu jsme použili dvojité agregační funkce v jediném dotazu min() a max(). Min() se používá ke zjištění minimálních známek z fyziky a Max() se používá ke zjištění maximálních známek z matematiky. Nejprve dotaz najde známky min() a max() z fyziky a matematiky ze studentské tabulky. Protože jsme použili klauzuli GROUP BY, takže podobné hodnoty mapované jako jedna skupina, jinak budou hodnoty jako oddělené. Protože žádné hodnoty v tabulce nejsou podobné, všechny hodnoty jsou odděleny. Žádné hodnoty nebudou mapovány jako jedna skupina. Dále jsme použili klauzuli HAVING, která funguje jako rozdíl klauzule WHERE pouze klauzule HAVING mapovaná do skupiny. Za prvé, podmínka je MIN(PHYSICS_MARKS)> 58. Protože žádné hodnoty nejsou podobné, každá hodnota bude považována za minimální hodnotu a ve srovnání s podmínkou se stejný přístup použije pro MAX(MATHS_MARKS). Jelikož jsme v dotazu použili operátor AND, tyto podmínky splňují obě podmínky. V konečném výstupu se zobrazí pouze záznamy těchto studentů.

Výstup výše uvedeného dotazu je:

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

Jak můžeme vidět ve výstupu, jsou zobrazeny pouze ty záznamy studentů, kde jsou minimální známky z fyzikálních hodnot větší než 56 A maximální známky z matematiky jsou menší než 98.

Pokud ve výše uvedeném příkladu použijete operátor OR místo operátoru AND, zobrazí se všech deset záznamů, protože operátor OR říká, že pokud jedna podmínka selže a ostatní podmínky jsou pravdivé, pak záznamy tabulky podmínky splňují.


  1. Jak se připojit k instanci SQL Server pomocí ověřování Windows nebo ověřování SQL Server - SQL Server / Výukový program T-SQL, část 3

  2. Příkaz Spool:Nevypisujte příkaz SQL do souboru

  3. Jak exportovat seznam propojených tabulek do Excelu z Accessu 2016

  4. Proaktivní kontroly stavu serveru SQL, část 1:Místo na disku