В тази статия ще научим за концепцията на клаузата HAVING и как да я използваме в SQL.
Каква е клаузата HAVING?
В езика на структурираните заявки клаузата HAVING, използвана с клауза GROUP BY, определя условията, които филтрират резултатите, появяващи се в изхода. Връща само тези данни от групата, които отговарят на условията.
С клаузата HAVING можем да използваме и клаузата WHERE в заявката. Ако използваме и двете клаузи заедно, клаузата WHERE ще се изпълни първо, където ще филтрира отделните редове, след това редовете се групират и накрая клаузата HAVING филтрира групите.
Условията на клаузата HAVING се поставят след клаузата GROUP BY. Клаузата HAVING се държи по същия начин като клаузата WHERE в езика за структурирани заявки не използва клаузата GROUP BY. Можем да използваме агрегатни функции като MIN, MAX, SUM, AVG и COUNT. Тази функция се използва само с клаузата SELECT и клаузата HAVING.
Синтаксис на клауза HAVING:
SELECT COLUMNS, AGGREGATE FUNCTION, FROM TABLENAME WHERE CONDITION GROUP BY COLUMN HAVING CONDITIONS;
Има някои стъпки, които трябва да научим за това как да използваме клаузата HAVING в SQL заявката:
1. Създайте нова база данни или използвайте съществуваща база данни, като изберете базата данни с помощта на ключовата дума USE, последвана от името на базата данни.
2. Създайте нова таблица в избраната база данни или можете да използвате вече създадена таблица.
3. Ако таблицата е създадена нова, вмъкнете записите в новосъздадената база данни с помощта на заявката INSERT и прегледайте вмъкнатите данни с помощта на заявката SELECT без клаузата HAVING.
4. Сега сме готови да използваме клаузата HAVING в SQL заявките.
Стъпка 1:Създайте нова база данни или използвайте вече създадена база данни.
Вече създадох база данни. Ще използвам съществуващото си създадено име на база данни.
USE SCHOOL;
School е името на базата данни.
Тези, които не са създали база данни, следвайте заявката по-долу, за да създадете база данни:
CREATE DATABASE database_name;
След като създадете базата данни, изберете я с помощта на ключовата дума USE, последвана от името на базата данни.
Стъпка 2:Създайте нова таблица или използвайте вече съществуваща таблица:
Вече създадох таблица. Ще използвам съществуващата таблица с име Student.
За да създадете новите таблици, следвайте по-долу синтаксис CREATE TABLE:
CREATE TABLE table_name(
columnname1 datatype(column size),
columnname2 datatype(column size),
columnname3 datatype(column size)
);
Стъпка 3:Вмъкнете записите в новосъздадената таблица с помощта на заявката INSERT и прегледайте записите с помощта на заявката SELECT.
Използвайте синтаксиса по-долу, за да вмъкнете нови записи в таблицата:
INSERT INTO table_name VALUES(value1, value2, value3);
За да видите записите от таблицата, като използвате следния синтаксис:
SELECT * FROM table_name;
Следната заявка ще покаже записите на служители
SELECT * FROM Student;
Резултатът от горната заявка SELECT е:
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS | CHEMISTRY_MARKS | MATHS_MARKS | ОБЩО_МАРКИ |
1 | NEHA | 85 | 88 | 100 | 273 |
2 | ВИШАЛ | 70 | 90 | 82 | 242 |
3 | SAMKEET | 75 | 88 | 96 | 259 |
4 | НИХИЛ | 60 | 75 | 80 | 215 |
5 | ЙОГЕШ | 56 | 65 | 78 | 199 |
6 | АНКИТА | 95 | 85 | 96 | 276 |
7 | SONAM | 98 | 89 | 100 | 287 |
8 | ВИНЕЕТ | 85 | 90 | 100 | 275 |
9 | SANKET | 86 | 78 | 65 | 229 |
10 | PRACHI | 90 | 80 | 75 | 245 |
Стъпка 4:Готови сме да използваме клаузата HAVING в езика за структурирани заявки.
Сега ще се потопим дълбоко в клаузата HAVING с помощта на примери.
Имаме таблица с име Student, която съдържа следните записи.
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS | CHEMISTRY_MARKS | MATHS_MARKS | ОБЩО_МАРКИ |
1 | NEHA | 85 | 88 | 100 | 273 |
2 | ВИШАЛ | 70 | 90 | 82 | 242 |
3 | SAMKEET | 75 | 88 | 96 | 259 |
4 | НИХИЛ | 60 | 75 | 80 | 215 |
5 | ЙОГЕШ | 56 | 65 | 78 | 199 |
6 | АНКИТА | 95 | 85 | 96 | 276 |
7 | SONAM | 98 | 89 | 100 | 287 |
8 | ВИНЕЕТ | 85 | 90 | 100 | 275 |
9 | SANKET | 86 | 78 | 65 | 229 |
10 | PRACHI | 90 | 80 | 75 | 245 |
Пример 1: Напишете заявка за показване на сумата от оценките по физика, където сборът на точките по физика е по-голям от 60 групи по идентификационен номер на ученик.
SELECT STUDENT_ID, STUDENT_NAME, SUM(PHYSICS_MARKS) AS PHYSICS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING SUM(PHYSICS_MARKS) > 60;
В горната заявка сме взели агрегатна функция с име SUM(), последвана от име на колона physics_marks, която ще сумира колоната. Първо се изпълнява Sum(physics_marks), след това условието на клауза HAVING се изпълнява в края и крайният резултат ще бъде показан. Използвахме клаузата GROUP BY, последвана от името на колоната Student_Id, за да групираме същите стойности и да ги считаме за една група. Ако стойностите не са еднакви, няма да се формира група за стойности. И накрая, ние използвахме клаузата HAVING, където поставяме условието, което ще помогне да се покажат само онези подробности за учениците, при които сумата от оценките по физика е по-голяма от 60. Ако оценките по физика на учениците са по-малки от 60, то няма да покаже записи.
Резултатът от горната заявка е:
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS |
1 | NEHA | 85 |
2 | ВИШАЛ | 70 |
3 | SAMKEET | 75 |
6 | АНКИТА | 95 |
7 | SONAM | 98 |
8 | ВИНЕЕТ | 85 |
9 | SANKET | 86 |
10 | PRACHI | 90 |
Както можем да видим в изхода, се показват само онези студентски идентификационни номера, имена и оценки по физика, където сумата от оценките по физика е по-голяма от 60. Тъй като използвахме клауза GROUP BY и няма подобни стойности, те се броят като една група .
Пример 2: Напишете заявка за показване на максималните оценки по химия, когато максималният бал по химия е по-малък от 90 групи по идентификационен номер на ученик.
SELECT STUDENT_ID, STUDENT_NAME, MAX(CHEMISTRY_MARKS) AS CHEMISTRY_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MAX(CHEMISTRY_MARKS) < 90;
В горната заявка сме взели агрегатна функция с име MAX(), последвана от име на колона chemistry_marks, която ще намери максималните знаци на колоната. Използвахме клаузата GROUP BY, последвана от името на колоната Student_Id, за да групираме същите стойности и да ги считаме за една група. Ако стойностите не са еднакви, тогава ще се формира отделна група за стойности. И накрая, ние използвахме клаузата HAVING, където поставяме условието, което ще помогне да се покажат само онези подробности за учениците, при които максималният бал по химия е по-малък от 90. Ако оценките по химия на учениците са по-големи от 90, това няма да показване на записите. Първо, MAX(chemistry_marks) се изпълнява, след това условието на клаузата HAVING се изпълнява в края и крайният резултат ще бъде показан. Резултатът от горната заявка е:
STUDENT_ID | STUDENT_NAME | CHEMISTRY_MARKS |
1 | NEHA | 88 |
3 | SAMKEET | 88 |
4 | НИХИЛ | 75 |
5 | ЙОГЕШ | 65 |
6 | АНКИТА | 85 |
7 | SONAM | 89 |
9 | SANKET | 78 |
10 | PRACHI | 80 |
Както можем да видим в изхода, се показват само онези студентски идентификатори, имена и оценки по химия, където максималният бал по химия е по-малък от 90. Тъй като използвахме клауза GROUP BY и няма подобни стойности, те се броят като единична група.
Пример 3: Напишете заявка за показване на оценките по математика, когато минималната оценка по математика е по-голяма от 70 групи по идентификационен номер на ученик.
SELECT STUDENT_ID, STUDENT_NAME, MIN(MATHS_MARKS) AS MATHS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MIN(MATHS_MARKS) >70;
В горната заявка сме взели агрегатна функция с име MIN(), последвана от име на колона maths_marks, която ще намери минималните знаци на колоната. Използвахме клаузата GROUP BY, последвана от името на колоната Student_Id, за да групираме същите стойности и да ги считаме за една група. Ако стойностите не са еднакви, тогава ще се формира отделна група за стойности. И накрая, ние използвахме клаузата HAVING, където поставяме условието, което ще помогне да се покажат само онези подробности за учениците, при които минималната оценка по математика е по-голяма от 70. Ако оценките по математика на ученика са по-малки от 70, това няма да показване на записите. Първо, MIN(maths_marks) се изпълнява, след това условието на клаузата HAVING се изпълнява в края и крайният резултат ще бъде показан.
Резултатът от горната заявка е:
STUDENT_ID | STUDENT_NAME | MATHS_MARKS |
1 | NEHA | 100 |
2 | ВИШАЛ | 82 |
3 | SAMKEET | 96 |
4 | НИХИЛ | 80 |
5 | ЙОГЕШ | 78 |
6 | АНКИТА | 96 |
7 | SONAM | 100 |
8 | ВИНЕЕТ | 100 |
10 | PRACHI | 75 |
Както можем да видим в изхода, се показват само онези студентски идентификатори, имена и оценки по математика, при които минималната оценка по математика е по-голяма от 70. Тъй като използвахме клауза GROUP BY и няма подобни стойности, те се броят като единична група.
Пример 4: Напишете заявка за показване на подробности за учениците, където минималните оценки по физика са по-големи от 56, а максималните оценки по математика са по-малки от 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;
Използвахме двойни агрегатни функции в единична заявка min() и max() в горната заявка. Min() се използва за намиране на минималните оценки по физика, а Max() се използва за откриване на максималните оценки по математика. Първо, заявката ще намери знаците min() и max() по физика и математика от таблицата на учениците. Тъй като използвахме клауза GROUP BY, така че подобни стойности са картографирани като една група, в противен случай стойностите ще бъдат като отделни. Тъй като в таблицата няма сходни стойности, всички стойности са разделени. Няма стойности да бъдат картографирани като една група. След това използвахме клаузата HAVING, която работи като разлика в клаузата WHERE само клаузата HAVING, преобразувана в групата. Първо, условието е MIN(PHYSICS_MARKS)> 58. Тъй като няма сходни стойности, всяка стойност ще се счита за минимална стойност и в сравнение с условието се използва същият подход за MAX(MATHS_MARKS). Тъй като използвахме оператор И в заявката, тези условия отговарят и на двете условия. Само записите на тези ученици се показват в крайния резултат.
Резултатът от горната заявка е:
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS | MATHS_MARKS |
2 | ВИШАЛ | 70 | 82 |
3 | SAMKEET | 75 | 96 |
4 | НИХИЛ | 60 | 80 |
6 | АНКИТА | 95 | 96 |
9 | SANKET | 86 | 65 |
10 | PRACHI | 90 | 75 |
Както можем да видим в изхода, се показват само онези студентски записи, при които минималните оценки по физика са по-големи от 56, А максималните оценки по математика са по-малки от 98.
В горния пример, ако се използва оператор OR вместо оператор AND, тогава всичките десет записа се показват, защото операторът OR казва, че ако едно условие е неуспешно и други условия са верни, тогава записите в таблицата отговарят на условията.