W tym artykule dowiemy się o koncepcji klauzuli HAVING i jak jej używać w SQL.
Co to jest klauzula HAVING?
W Structured Query Language klauzula HAVING używana z klauzulą GROUP BY określa warunki filtrowania wyników pojawiających się w danych wyjściowych. Zwraca tylko te dane z grupy, które spełniają warunki.
Dzięki klauzuli HAVING możemy użyć klauzuli WHERE również w zapytaniu. Jeśli użyjemy obu klauzul jednocześnie, klauzula WHERE zostanie wykonana jako pierwsza, gdzie będzie filtrować poszczególne wiersze, następnie wiersze zostaną pogrupowane, a na końcu klauzula HAVING filtruje grupy.
Warunki klauzuli HAVING są umieszczane po klauzuli GROUP BY. Klauzula HAVING zachowywała się tak samo jak klauzula WHERE w strukturalnym języku zapytań nie używa klauzuli GROUP BY. Możemy używać funkcji agregujących, takich jak MIN, MAX, SUM, AVG i COUNT. Ta funkcja jest używana tylko z klauzulą SELECT i klauzulą HAVING.
Składnia klauzuli HAVING:
SELECT COLUMNS, AGGREGATE FUNCTION, FROM TABLENAME WHERE CONDITION GROUP BY COLUMN HAVING CONDITIONS;
Musimy się nauczyć kilku kroków, jak używać klauzuli HAVING w zapytaniu SQL:
1. Utwórz nową bazę danych lub użyj istniejącej bazy danych, wybierając bazę danych za pomocą słowa kluczowego USE, po którym następuje nazwa bazy danych.
2. Utwórz nową tabelę w wybranej bazie danych lub możesz użyć już utworzonej tabeli.
3. Jeśli tabela została utworzona jako nowa, wstaw rekordy w nowo utworzonej bazie danych za pomocą zapytania INSERT i wyświetl wstawione dane za pomocą zapytania SELECT bez klauzuli HAVING.
4. Teraz jesteśmy gotowi do użycia klauzuli HAVING w zapytaniach SQL.
Krok 1:Utwórz nową bazę danych lub użyj już utworzonej bazy danych.
Stworzyłem już bazę danych. Użyję mojej istniejącej nazwy utworzonej bazy danych.
USE SCHOOL;
Szkoła to nazwa bazy danych.
Ci, którzy nie stworzyli bazy danych, wykonaj poniższe zapytanie, aby utworzyć bazę danych:
CREATE DATABASE database_name;
Po utworzeniu bazy danych wybierz bazę danych, używając słowa kluczowego USE, a następnie nazwy bazy danych.
Krok 2:Utwórz nową tabelę lub użyj już istniejącej:
Stworzyłem już tabelę. Użyję istniejącej tabeli o nazwie Student.
Aby utworzyć nowe tabele, postępuj zgodnie z poniższą składnią CREATE TABLE:
CREATE TABLE table_name(
columnname1 datatype(column size),
columnname2 datatype(column size),
columnname3 datatype(column size)
);
Krok 3:wstaw rekordy do nowo utworzonej tabeli za pomocą zapytania INSERT i wyświetl rekordy za pomocą zapytania SELECT.
Użyj poniższej składni, aby wstawić nowe rekordy do tabeli:
INSERT INTO table_name VALUES(value1, value2, value3);
Aby wyświetlić rekordy z tabeli, używając poniższej składni:
SELECT * FROM table_name;
Następujące zapytanie wyświetli rekordy pracowników
SELECT * FROM Student;
Dane wyjściowe powyższego zapytania SELECT to:
STUDENT_ID | NAZWISKO UCZNIA | 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 | JOGESZ | 56 | 65 | 78 | 199 |
6 | ANKITA | 95 | 85 | 96 | 276 |
7 | SONAM | 98 | 89 | 100 | 287 |
8 | WININA | 85 | 90 | 100 | 275 |
9 | KOSZULKA | 86 | 78 | 65 | 229 |
10 | PRACI | 90 | 80 | 75 | 245 |
Krok 4:Jesteśmy gotowi do użycia klauzuli HAVING w ustrukturyzowanym języku zapytań.
Za pomocą przykładów przyjrzymy się teraz klauzuli HAVING.
Mamy tabelę o nazwie Student, która zawiera następujące rekordy.
STUDENT_ID | NAZWISKO UCZNIA | 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 | JOGESZ | 56 | 65 | 78 | 199 |
6 | ANKITA | 95 | 85 | 96 | 276 |
7 | SONAM | 98 | 89 | 100 | 287 |
8 | WININA | 85 | 90 | 100 | 275 |
9 | KOSZULKA | 86 | 78 | 65 | 229 |
10 | PRACI | 90 | 80 | 75 | 245 |
Przykład 1: Napisz zapytanie, aby wyświetlić sumę ocen z fizyki, gdy suma ocen z fizyki jest większa niż 60 grup według identyfikatora ucznia.
SELECT STUDENT_ID, STUDENT_NAME, SUM(PHYSICS_MARKS) AS PHYSICS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING SUM(PHYSICS_MARKS) > 60;
W powyższym zapytaniu przyjęliśmy funkcję agregującą o nazwie SUM(), po której następuje nazwa kolumny Physical_marks, która zsumuje kolumnę. Najpierw wykonywane jest polecenie Sum(physics_marks), a na końcu warunek klauzuli HAVING i wyświetlany jest wynik końcowy. Użyliśmy klauzuli GROUP BY, po której następuje nazwa kolumny Student_Id, aby pogrupować te same wartości i uznać je za jedną grupę. Jeśli wartości nie są takie same, nie zostanie utworzona żadna grupa dla wartości. I na koniec użyliśmy klauzuli HAVING, w której postawiliśmy warunek, który pomoże wyświetlić tylko te szczegóły uczniów, których suma ocen z fizyki jest większa niż 60. Jeśli oceny uczniów z fizyki są mniejsze niż 60, nie wyświetli się rekordy.
Wynikiem powyższego zapytania jest:
STUDENT_ID | NAZWISKO UCZNIA | PHYSICS_MARKS |
1 | NEHA | 85 |
2 | VISHAL | 70 |
3 | SAMKEET | 75 |
6 | ANKITA | 95 |
7 | SONAM | 98 |
8 | WININA | 85 |
9 | KOSZULKA | 86 |
10 | PRACI | 90 |
Jak widać w wynikach, wyświetlane są tylko te identyfikatory, nazwiska i oceny z fizyki uczniów, dla których suma ocen z fizyki jest większa niż 60. Ponieważ użyliśmy klauzuli GROUP BY i żadne wartości nie są podobne, są one liczone jako jedna grupa .
Przykład 2: Napisz zapytanie, aby wyświetlić maksymalne oceny z chemii, gdy maksymalna ocena z chemii jest mniejsza niż 90 grup według identyfikatora ucznia.
SELECT STUDENT_ID, STUDENT_NAME, MAX(CHEMISTRY_MARKS) AS CHEMISTRY_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MAX(CHEMISTRY_MARKS) < 90;
W powyższym zapytaniu przyjęliśmy funkcję agregującą o nazwie MAX(), po której następuje nazwa kolumny chemistry_marks, która znajdzie maksymalne oznaczenia kolumny. Użyliśmy klauzuli GROUP BY, po której następuje nazwa kolumny Student_Id, aby pogrupować te same wartości i uznać je za jedną grupę. Jeśli wartości nie są takie same, dla wartości zostanie utworzona osobna grupa. I na koniec użyliśmy klauzuli HAVING, w której umieściliśmy warunek, który pomoże wyświetlić tylko te szczegóły uczniów, których maksymalna ocena z chemii jest mniejsza niż 90. Jeśli oceny z chemii uczniów są większe niż 90, nie będzie wyświetlić rekordy. Najpierw zostanie wykonane MAX(chemistry_marks), następnie warunek klauzuli HAVING zostanie wykonany na końcu i wyświetlony zostanie wynik końcowy. Wynikiem powyższego zapytania jest:
STUDENT_ID | NAZWISKO UCZNIA | CHEMISTRY_MARKS |
1 | NEHA | 88 |
3 | SAMKEET | 88 |
4 | NIKHIL | 75 |
5 | JOGESZ | 65 |
6 | ANKITA | 85 |
7 | SONAM | 89 |
9 | KOSZULKA | 78 |
10 | PRACI | 80 |
Jak widać w danych wyjściowych, wyświetlane są tylko te legitymacje, nazwiska i oceny z chemii uczniów, dla których maksymalna ocena z chemii jest mniejsza niż 90. Ponieważ użyliśmy klauzuli GROUP BY i żadne wartości nie są podobne, są one liczone jako pojedyncze grupa.
Przykład 3: Napisz zapytanie, aby wyświetlić oceny z matematyki, w których minimalna ocena z matematyki jest większa niż 70 grup według identyfikatora ucznia.
SELECT STUDENT_ID, STUDENT_NAME, MIN(MATHS_MARKS) AS MATHS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MIN(MATHS_MARKS) >70;
W powyższym zapytaniu przyjęliśmy funkcję agregującą o nazwie MIN(), po której następuje nazwa kolumny maths_marks, która znajdzie minimalne znaczniki kolumny. Użyliśmy klauzuli GROUP BY, po której następuje nazwa kolumny Student_Id, aby pogrupować te same wartości i uznać je za jedną grupę. Jeśli wartości nie są takie same, dla wartości zostanie utworzona osobna grupa. I na koniec użyliśmy klauzuli HAVING, w której postawiliśmy warunek, który pomoże wyświetlić tylko te szczegóły uczniów, w których minimalna ocena z matematyki jest większa niż 70. Jeśli oceny z matematyki Studenta są mniejsze niż 70, nie będzie wyświetlić rekordy. Najpierw wykonywane jest MIN(maths_marks), następnie warunek klauzuli HAVING jest wykonywany na końcu i wyświetlany jest wynik końcowy.
Wynikiem powyższego zapytania jest:
STUDENT_ID | NAZWISKO UCZNIA | MATHS_MARKS |
1 | NEHA | 100 |
2 | VISHAL | 82 |
3 | SAMKEET | 96 |
4 | NIKHIL | 80 |
5 | JOGESZ | 78 |
6 | ANKITA | 96 |
7 | SONAM | 100 |
8 | WININA | 100 |
10 | PRACI | 75 |
Jak widać w danych wyjściowych, wyświetlane są tylko te identyfikatory, nazwiska i znaki matematyczne uczniów, dla których minimalna ocena z matematyki jest większa niż 70. Ponieważ użyliśmy klauzuli GROUP BY i żadne wartości nie są podobne, są one liczone jako pojedyncze grupa.
Przykład 4: Napisz zapytanie, aby wyświetlić szczegóły uczniów, w których minimalna ocena z fizyki jest większa niż 56, ORAZ maksymalna ocena z matematyki jest mniejsza niż 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;
Użyliśmy funkcji podwójnej agregacji w pojedynczym zapytaniu min() i max() w powyższym zapytaniu. Min() służy do znalezienia minimalnych ocen z fizyki, a Max() służy do znalezienia maksymalnych ocen matematycznych. Najpierw zapytanie znajdzie znaki min() i max() z fizyki i matematyki z tabeli uczniów. Ponieważ użyliśmy klauzuli GROUP BY, więc podobne wartości są mapowane jako jedna grupa, w przeciwnym razie wartości będą tak samo oddzielone. Ponieważ w tabeli nie ma podobnych wartości, wszystkie wartości zostały rozdzielone. Żadne wartości nie będą mapowane jako jedna grupa. Następnie użyliśmy klauzuli HAVING, która działa jako różnica klauzuli WHERE tylko klauzula HAVING mapowana do grupy. Po pierwsze, warunek to MIN(PHYSICS_MARKS)> 58. Ponieważ żadne wartości nie są podobne, każda wartość będzie traktowana jako wartość minimalna i porównana z warunkiem, to samo podejście jest stosowane dla MAX(MATHS_MARKS). Ponieważ w zapytaniu użyliśmy operatora AND, warunki te spełniają oba warunki. Tylko rekordy tych uczniów są wyświetlane w ostatecznym wyniku.
Wynikiem powyższego zapytania jest:
STUDENT_ID | NAZWISKO UCZNIA | PHYSICS_MARKS | MATHS_MARKS |
2 | VISHAL | 70 | 82 |
3 | SAMKEET | 75 | 96 |
4 | NIKHIL | 60 | 80 |
6 | ANKITA | 95 | 96 |
9 | KOSZULKA | 86 | 65 |
10 | PRACI | 90 | 75 |
Jak widać na wyjściu, wyświetlane są tylko te rekordy uczniów, w których minimalne oceny z wartości fizycznych są większe niż 56, ORAZ maksymalne oceny matematyczne są mniejsze niż 98.
W powyższym przykładzie, jeśli zostanie użyty operator OR zamiast operatora AND, to wszystkie dziesięć rekordów zostanie wyświetlonych, ponieważ operator OR mówi, że jeśli jeden warunek nie powiedzie się, a inne są spełnione, to rekordy tabeli spełniają warunki.