Ở lệnh SELECT chúng ta có WHERE dùng để lọc, vậy ở Group By sẽ lọc dữ liệu bằng cách nào? Rất đơn giản, bạn sẽ sử dụng lệnh HAVING, lệnh này có cách dùng giống với lệnh WHERE.
1. Cú pháp Having trong Oracle
Trước tiên mình sẽ đưa ra cú pháp:
SELECT expression1, expression2, ... expression_n FROM tables WHERE conditions GROUP BY expression1, expression2, ... expression_n HAVING having_condition;
Trong đó:
- expression1, expression2, … expression_n là các column sẽ được chọn cho kết quả cuối cùng
- tables là bảng cần truy vấn
- conditions là điều kiện ở where
- having_conditions là điều kiện của
HAVING
, cái này là chủ chốt của bài học hôm nay.
Có những điều kiện ta không thể lọc ở lệnh WHERE được. Ví dụ mình muốn lấy tổng số sinh viên của của từng khoa, và chỉ hiển thị khoa nào có tổng sinh viên lớn hơn 50.
Bài viết này được đăng tại [kiso.vn]
Bảng students
sẽ có các thông tin như sau: id | name | department
Và nếu mình viết thế này là sai:
SELECT department, count(id) as total_student FROM students WHERE total_student> 50 GROUP BY department
Tại sao sai? Để giải thích mình sẽ nói qua câu lệnh SQL hoạt động như thế nào đã nhé.
Như ta biết trong một câu lệnh SQL sẽ có rất nhiều lệnh con, vậy thứ tự hoạt động của nó như thế nào? Nó sẽ hoạt động như sau:
FROM > WHERE > GROUP BY > HAVING > DISTINCT > SELECT > ORDER BY
Dựa vào câu truy vấn ở trên thì ta thấy FROM -> WHERE
, mà lúc này column ở WHERE
là total_student
không hề tồn tại (vì lệnh SELECT chưa chạy), nên câu SQL này sai. Ta sẽ sửa lại như sau:
SELECT department, count(id) as total_student FROM students GROUP BY department HAVING total_student > 50
2. Một vài ví dụ với lệnh HAVING trong Oracle
Giả sử cho bảng customers
có dữ liệu như sau:
Hãy lấy danh sách state và tổng số khách hàng của state đó, và chỉ lấy state nào có từ 2 khách hàng trở lên.
SELECT state, COUNT(*) AS total_customer FROM customers GROUP BY state HAVING total_customer >= 2;
Giả sử giờ mình sửa lại điều kiện như sau: Lấy danh sách state và tổng số khách hàng có mức lương lớn hơn 10000, và chỉ lấy state nào có từ 2 khách hàng thỏa điều kiện trở lên.
SELECT state, COUNT(*) AS total_customer FROM customers WHERE salary > 10000 GROUP BY state HAVING total_customer >= 2;
3. Lời kết
Trên là tất cả kiến thức về having trong Oracle mà mình muốn giới thiệu tới các bạn.
Sau này khi nói đến Group by thì các bạn hãy nhớ tới Having nhé, vì đây là cặp mệnh đề đi liền với nhau, rất thường được sử dụng trong các câu truy vấn thống kê.
Bài viết liên quan
[CSF-2] Một số thiết lập CSF, LFD
Hôm nay mình sẽ thực hiện một số thiết lập trên CSF Mở file config để sửa đổi một số tính năng dưới /etc/csf/csf.conf Nội dung chính1. Cú pháp Having trong Oracle2. Một vài ví...
[CSF-1] Tăng bảo mật Server với ConfigServer Firewall (CSF)
Nội dung chính1. Cú pháp Having trong Oracle2. Một vài ví dụ với lệnh HAVING trong Oracle3. Lời kết1. Khái niệm CSF: CSF (ConfigServer & Firewall) là một bộ ứng dụng hoạt động trên Linux...
Sử dụng SSH Key với Gitlab và Github
Bài viết này mình sẽ hướng dẫn các bạn tạo ssh key cho Gitlab và Github SSH là gì? Secure Socket Shell là một giao thức mạng dùng để thiết lập kết nối mạng một...
Directory traversal vulnerabilities (phần 4)
Nội dung chính1. Cú pháp Having trong Oracle2. Một vài ví dụ với lệnh HAVING trong Oracle3. Lời kếtV. Phân tích và khai thác các lỗ hổng Directory traversal (tiếp) 5. Bypass lỗ hổng khi...
Directory traversal vulnerabilities (phần 3)
Nội dung chính1. Cú pháp Having trong Oracle2. Một vài ví dụ với lệnh HAVING trong Oracle3. Lời kếtV. Phân tích và khai thác các lỗ hổng Directory traversal 1. Lỗ hổng xảy ra khi...
Directory traversal vulnerabilities (phần 2)
Nội dung chính1. Cú pháp Having trong Oracle2. Một vài ví dụ với lệnh HAVING trong Oracle3. Lời kếtIII. Vì sao lỗ hổng Directory traversal xuất hiện? Với mỗi ngôn ngữ lập trình khác nhau,...