Trong bài viết này, chúng ta sẽ tìm hiểu về khái niệm mệnh đề HAVING và cách sử dụng nó trong SQL.
Mệnh đề HAVING là gì?
Trong Ngôn ngữ truy vấn có cấu trúc, Mệnh đề HAVING được sử dụng với Mệnh đề GROUP BY chỉ định các điều kiện lọc kết quả xuất hiện trong đầu ra. Nó chỉ trả về những dữ liệu từ nhóm đáp ứng các điều kiện.
Với mệnh đề HAVING, chúng ta có thể sử dụng mệnh đề WHERE trong truy vấn. Nếu chúng ta sử dụng Cả hai điều khoản cùng nhau, mệnh đề WHERE sẽ được thực thi trước tiên, nơi nó sẽ lọc các hàng riêng lẻ, sau đó các hàng được nhóm lại và cuối cùng, Mệnh đề HAVING lọc các nhóm.
Điều kiện mệnh đề HAVING được đặt sau mệnh đề GROUP BY. Mệnh đề HAVING hoạt động giống như mệnh đề WHERE trong Ngôn ngữ truy vấn có cấu trúc không sử dụng mệnh đề GROUP BY. Chúng ta có thể sử dụng các hàm tổng hợp như MIN, MAX, SUM, AVG và COUNT. Hàm này chỉ được sử dụng với mệnh đề SELECT và mệnh đề HAVING.
Cú pháp của mệnh đề HAVING:
SELECT COLUMNS, AGGREGATE FUNCTION, FROM TABLENAME WHERE CONDITION GROUP BY COLUMN HAVING CONDITIONS;
Có một số bước chúng ta phải học để biết cách sử dụng mệnh đề HAVING trong truy vấn SQL:
1. Tạo cơ sở dữ liệu mới hoặc sử dụng cơ sở dữ liệu hiện có bằng cách chọn cơ sở dữ liệu bằng từ khóa USE theo sau là tên cơ sở dữ liệu.
2. Tạo một bảng mới bên trong cơ sở dữ liệu đã chọn hoặc bạn có thể sử dụng một bảng đã được tạo.
3. Nếu bảng được tạo mới, hãy chèn các bản ghi vào cơ sở dữ liệu mới được tạo bằng cách sử dụng truy vấn INSERT và xem dữ liệu được chèn bằng truy vấn SELECT mà không có mệnh đề HAVING.
4. Bây giờ, chúng ta đã sẵn sàng sử dụng mệnh đề HAVING trong các truy vấn SQL.
Bước 1:Tạo cơ sở dữ liệu mới hoặc sử dụng cơ sở dữ liệu đã được tạo.
Tôi đã tạo một cơ sở dữ liệu. Tôi sẽ sử dụng tên cơ sở dữ liệu đã tạo hiện có của mình.
USE SCHOOL;
Trường là tên cơ sở dữ liệu.
Những người chưa tạo cơ sở dữ liệu, hãy làm theo truy vấn dưới đây để tạo cơ sở dữ liệu:
CREATE DATABASE database_name;
Sau khi tạo cơ sở dữ liệu, hãy chọn cơ sở dữ liệu bằng cách sử dụng từ khóa USE, theo sau là tên cơ sở dữ liệu.
Bước 2:Tạo bảng mới hoặc sử dụng bảng đã có:
Tôi đã tạo một bảng. Tôi sẽ sử dụng bảng hiện có có tên là Sinh viên.
Để tạo bảng mới, hãy làm theo cú pháp TẠO BẢNG bên dưới:
CREATE TABLE table_name(
columnname1 datatype(column size),
columnname2 datatype(column size),
columnname3 datatype(column size)
);
Bước 3:Chèn các bản ghi vào bảng mới tạo bằng truy vấn INSERT và xem các bản ghi bằng truy vấn CHỌN.
Sử dụng cú pháp dưới đây để chèn các bản ghi mới trong bảng:
INSERT INTO table_name VALUES(value1, value2, value3);
Để xem các bản ghi từ bảng bằng cú pháp dưới đây:
SELECT * FROM table_name;
Truy vấn sau sẽ hiển thị hồ sơ của Nhân viên
SELECT * FROM Student;
Kết quả của truy vấn SELECT ở trên là:
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 | MẪU | 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 |
Bước 4:Chúng tôi đã sẵn sàng sử dụng mệnh đề HAVING trong Ngôn ngữ truy vấn có cấu trúc.
Bây giờ chúng ta sẽ đi sâu vào mệnh đề HAVING với sự trợ giúp của các ví dụ.
Chúng tôi có một bảng tên là Sinh viên chứa các bản ghi sau.
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 | MẪU | 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 |
Ví dụ 1: Viết truy vấn để hiển thị tổng điểm vật lý trong đó tổng điểm vật lý lớn hơn 60 nhóm theo id học sinh.
SELECT STUDENT_ID, STUDENT_NAME, SUM(PHYSICS_MARKS) AS PHYSICS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING SUM(PHYSICS_MARKS) > 60;
Trong truy vấn trên, chúng tôi đã sử dụng một hàm tổng hợp có tên là SUM () theo sau là tên cột vật lý_các dấu hiệu, sẽ tính tổng cột. Tổng đầu tiên (vật lý_ đánh dấu) được thực thi, sau đó điều kiện mệnh đề HAVING được thực thi ở cuối và kết quả cuối cùng sẽ được hiển thị. Chúng tôi đã sử dụng mệnh đề GROUP BY theo sau là tên cột Student_Id để nhóm các giá trị giống nhau và coi chúng là một nhóm. Nếu các giá trị không giống nhau, sẽ không có nhóm nào được thành lập cho các giá trị. Và cuối cùng, chúng tôi đã sử dụng mệnh đề HAVING trong đó chúng tôi đặt điều kiện sẽ giúp chỉ hiển thị những chi tiết của học sinh có tổng điểm vật lý lớn hơn 60. Nếu điểm vật lý của học sinh nhỏ hơn 60, nó sẽ không hiển thị hồ sơ.
Kết quả của truy vấn trên là:
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS |
1 | NEHA | 85 |
2 | VISHAL | 70 |
3 | MẪU | 75 |
6 | ANKITA | 95 |
7 | SONAM | 98 |
8 | VINEET | 85 |
9 | SANKET | 86 |
10 | PRACHI | 90 |
Như chúng ta có thể thấy trong đầu ra, chỉ những id sinh viên, tên và điểm vật lý được hiển thị khi tổng điểm vật lý lớn hơn 60. Vì chúng tôi đã sử dụng mệnh đề GROUP BY và không có giá trị nào tương tự, chúng được tính là một nhóm duy nhất .
Ví dụ 2: Viết một truy vấn để hiển thị điểm tối đa của điểm hóa học trong đó điểm tối đa của điểm hóa học dưới 90 nhóm tính theo id học sinh.
SELECT STUDENT_ID, STUDENT_NAME, MAX(CHEMISTRY_MARKS) AS CHEMISTRY_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MAX(CHEMISTRY_MARKS) < 90;
Trong truy vấn trên, chúng tôi đã sử dụng một hàm tổng hợp có tên MAX () theo sau là tên cột chemistry_marks, hàm này sẽ tìm điểm tối đa của cột. Chúng tôi đã sử dụng mệnh đề GROUP BY theo sau là tên cột Student_Id để nhóm các giá trị giống nhau và coi chúng là một nhóm. Nếu các giá trị không giống nhau, thì một nhóm riêng biệt sẽ được hình thành cho các giá trị. Và ở phần cuối, chúng tôi đã sử dụng mệnh đề HAVING trong đó chúng tôi đặt điều kiện sẽ giúp chỉ hiển thị những thông tin chi tiết về học sinh có điểm tối đa của điểm hóa học nhỏ hơn 90. Nếu điểm hóa học của học sinh lớn hơn 90, nó sẽ không hiển thị các bản ghi. Đầu tiên, MAX (chemistry_marks) được thực thi, sau đó điều kiện mệnh đề HAVING được thực thi ở cuối và kết quả cuối cùng sẽ được hiển thị. Kết quả của truy vấn trên là:
STUDENT_ID | STUDENT_NAME | CHEMISTRY_MARKS |
1 | NEHA | 88 |
3 | MẪU | 88 |
4 | NIKHIL | 75 |
5 | YOGESH | 65 |
6 | ANKITA | 85 |
7 | SONAM | 89 |
9 | SANKET | 78 |
10 | PRACHI | 80 |
Như chúng ta có thể thấy trong đầu ra, chỉ những id sinh viên, tên và điểm hóa học được hiển thị khi điểm tối đa của điểm hóa học nhỏ hơn 90. Vì chúng tôi đã sử dụng mệnh đề GROUP BY và không có giá trị nào tương tự, chúng được tính là một nhóm.
Ví dụ 3: Viết một truy vấn để hiển thị các điểm toán học trong đó điểm tối thiểu của điểm toán học lớn hơn 70 nhóm tính theo id học sinh.
SELECT STUDENT_ID, STUDENT_NAME, MIN(MATHS_MARKS) AS MATHS_MARKS FROM STUDENT GROUP BY STUDENT_ID HAVING MIN(MATHS_MARKS) >70;
Trong truy vấn trên, chúng ta đã sử dụng một hàm tổng hợp có tên MIN () theo sau là tên cột maths_marks, hàm này sẽ tìm các điểm tối thiểu của cột. Chúng tôi đã sử dụng mệnh đề GROUP BY theo sau là tên cột Student_Id để nhóm các giá trị giống nhau và coi chúng là một nhóm. Nếu các giá trị không giống nhau, thì một nhóm riêng biệt sẽ được hình thành cho các giá trị. Và ở phần cuối, chúng tôi đã sử dụng mệnh đề HAVING trong đó chúng tôi đặt điều kiện sẽ giúp hiển thị chỉ những thông tin chi tiết về học sinh khi điểm tối thiểu của điểm toán lớn hơn 70. Nếu điểm toán của học sinh nhỏ hơn 70, nó sẽ không hiển thị các bản ghi. Đầu tiên, MIN (maths_marks) được thực thi, sau đó điều kiện mệnh đề HAVING được thực thi ở cuối và kết quả cuối cùng sẽ được hiển thị.
Kết quả của truy vấn trên là:
STUDENT_ID | STUDENT_NAME | MATHS_MARKS |
1 | NEHA | 100 |
2 | VISHAL | 82 |
3 | MẪU | 96 |
4 | NIKHIL | 80 |
5 | YOGESH | 78 |
6 | ANKITA | 96 |
7 | SONAM | 100 |
8 | VINEET | 100 |
10 | PRACHI | 75 |
Như chúng ta có thể thấy trong đầu ra, chỉ những id sinh viên, tên và điểm toán được hiển thị khi điểm tối thiểu của điểm toán lớn hơn 70. Vì chúng tôi đã sử dụng mệnh đề GROUP BY và không có giá trị nào tương tự, chúng được tính là một nhóm.
Ví dụ 4: Viết truy vấn để hiển thị thông tin chi tiết về học sinh trong đó điểm vật lý tối thiểu lớn hơn 56, VÀ điểm toán học tối đa nhỏ hơ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;
Chúng tôi đã sử dụng các hàm tổng hợp kép trong một truy vấn đơn min () và max () trong truy vấn trên. Min () được sử dụng để tìm ra điểm tối thiểu của vật lý và Max () được sử dụng để tìm ra điểm tối đa của môn toán. Đầu tiên, truy vấn sẽ tìm điểm min () và max () của vật lý và toán học từ bảng học sinh. Vì chúng ta đã sử dụng mệnh đề GROUP BY, vì vậy các giá trị tương tự được ánh xạ thành một nhóm, các giá trị khác sẽ được tách biệt. Vì không có giá trị nào giống nhau trong bảng nên tất cả các giá trị đã tách biệt nhau. Không có giá trị nào sẽ được ánh xạ thành một nhóm. Tiếp theo, chúng tôi sử dụng mệnh đề HAVING, mệnh đề này hoạt động như mệnh đề WHERE chỉ khác mệnh đề HAVING được ánh xạ vào nhóm. Đầu tiên, điều kiện là MIN (PHYSICS_MARKS)> 58. Vì không có giá trị nào giống nhau nên mỗi giá trị sẽ được coi là giá trị nhỏ nhất và so với điều kiện, cách tiếp cận tương tự được sử dụng cho MAX (MATHS_MARKS). Khi chúng tôi sử dụng toán tử AND trong truy vấn, các điều kiện đó đáp ứng cả hai điều kiện. Chỉ hồ sơ của những sinh viên đó được hiển thị trong kết quả cuối cùng.
Kết quả của truy vấn trên là:
STUDENT_ID | STUDENT_NAME | PHYSICS_MARKS | MATHS_MARKS |
2 | VISHAL | 70 | 82 |
3 | MẪU | 75 | 96 |
4 | NIKHIL | 60 | 80 |
6 | ANKITA | 95 | 96 |
9 | SANKET | 86 | 65 |
10 | PRACHI | 90 | 75 |
Như chúng ta có thể thấy trong đầu ra, chỉ những hồ sơ học sinh đó được hiển thị trong đó điểm tối thiểu của các giá trị vật lý lớn hơn 56 và điểm tối đa của toán học nhỏ hơn 98.
Trong ví dụ trên, nếu được sử dụng toán tử OR thay vì toán tử AND, thì tất cả mười bản ghi được hiển thị vì toán tử OR cho biết nếu một điều kiện không thành công và các điều kiện khác đúng, thì bản ghi bảng đáp ứng các điều kiện.