PostgreSQL - HAVING Clauses: A Friendly Guide for Beginners

Xin chào các bạn đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng nhau khám phá một chủ đề thú vị trong PostgreSQL: Clauses HAVING. Đừng lo lắng nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn từng bước qua khái niệm này, cũng như tôi đã làm cho hàng trăm sinh viên trong những năm dạy học của mình. Nào, hãy cùng uống một ly đồ uống yêu thích và bắt đầu hành trình học tập này cùng nhau!

PostgreSQL - Having Clause

What is the HAVING Clause?

Trước khi chúng ta đi vào chi tiết, hãy hiểu về Clauses HAVING là gì. Hãy tưởng tượng bạn đang tổ chức một bữa tiệc lớn (cơ sở dữ liệu), và bạn muốn phân nhóm khách của mình (dữ liệu) dựa trên màu sắc yêu thích của họ (GROUP BY). Bây giờ, nếu bạn chỉ muốn tập trung vào các nhóm màu có hơn năm người, đó là lúc Clauses HAVING phát huy tác dụng!

Trong PostgreSQL, Clauses HAVING cho phép chúng ta lọc dữ liệu đã được nhóm dựa trên các điều kiện cụ thể. Nó giống như một bảo vệ ở tiệc của bạn, quyết định哪些 nhóm được ở lại dựa trên tiêu chí của bạn.

Syntax of the HAVING Clause

Hãy cùng xem qua cú pháp cơ bản của Clauses HAVING:

SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;

Dưới đây là ý nghĩa của từng phần:

  1. SELECT: Chỉ định các cột mà bạn muốn truy xuất.
  2. aggregate_function: Một hàm như COUNT(), SUM(), AVG(), v.v.
  3. FROM: Chỉ định bảng mà bạn đang truy vấn.
  4. GROUP BY: Nhóm kết quả theo một hoặc nhiều cột.
  5. HAVING: Lọc kết quả đã được nhóm dựa trên một điều kiện.

Bây giờ, hãy xem điều này trong thực tế với một số ví dụ!

Example 1: Basic HAVING Clause

Hãy tưởng tượng chúng ta có một bảng gọi là employees với các cột: id, name, department, và salary. Hãy tìm các phòng ban có mức lương trung bình lớn hơn $50,000.

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;

Truy vấn này thực hiện các bước sau:

  1. Nhóm nhân viên theo phòng ban.
  2. Tính mức lương trung bình cho mỗi phòng ban.
  3. Chỉ hiển thị các phòng ban có mức lương trung bình trên $50,000.

Example 2: HAVING with COUNT

Bây giờ, hãy tìm các phòng ban có hơn 5 nhân viên:

SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

Đây là những gì đang xảy ra:

  1. Chúng ta nhóm nhân viên theo phòng ban.
  2. Chúng ta đếm số lượng nhân viên trong mỗi phòng ban.
  3. Chúng ta chỉ hiển thị các phòng ban có hơn 5 nhân viên.

Example 3: Combining WHERE and HAVING

Hãy làm cho nó phức tạp hơn một chút! Chúng ta sẽ tìm các phòng ban có mức lương trung bình trên $60,000, nhưng chỉ tính nhân viên được tuyển dụng sau năm 2010:

SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE hire_date > '2010-01-01'
GROUP BY department
HAVING AVG(salary) > 60000;

Truy vấn này:

  1. Lọc nhân viên được tuyển dụng sau năm 2010 (sử dụng WHERE).
  2. Nhóm các nhân viên còn lại theo phòng ban.
  3. Tính mức lương trung bình cho mỗi nhóm.
  4. Chỉ hiển thị các phòng ban có mức lương trung bình trên $60,000.

The Difference Between WHERE and HAVING

Bây giờ, bạn có thể tự hỏi, "Tại sao chúng ta không thể chỉ sử dụng WHERE cho mọi thứ?" Đó là một câu hỏi tuyệt vời! Dưới đây là một cách đơn giản để nhớ:

  • WHERE lọc các hàng cá nhân trước khi chúng được nhóm.
  • HAVING lọc các nhóm sau khi các hàng được nhóm.

Hãy tưởng tượng như này: WHERE là bảo vệ kiểm tra ID ở cửa, trong khi HAVING là bảo vệ bên trong quyết định哪些 nhóm được ở lại dựa trên hành vi của họ.

Common Aggregate Functions Used with HAVING

Dưới đây là bảng tiện ích của các hàm tổng hợp phổ biến mà bạn có thể sử dụng với HAVING:

Function Description Example
COUNT() Đếm số lượng hàng HAVING COUNT(*) > 5
SUM() Tính tổng một tập giá trị HAVING SUM(salary) > 100000
AVG() Tính trung bình một tập giá trị HAVING AVG(age) < 30
MAX() Tìm giá trị lớn nhất HAVING MAX(price) < 1000
MIN() Tìm giá trị nhỏ nhất HAVING MIN(rating) > 3

Practical Exercise: Let's Party!

Để巩固我们的理解, 让我们计划一下我们之前提到的派对。我们将使用一个名为 guests 的表,包含列:name, age, favorite_color, 和 bringing_snacks

-- Tìm các màu có hơn 3 khách, nơi tuổi trung bình trên 25
SELECT favorite_color, COUNT(*) as guest_count, AVG(age) as avg_age
FROM guests
GROUP BY favorite_color
HAVING COUNT(*) > 3 AND AVG(age) > 25;

-- Tìm các màu nơi hơn 50% của khách mang theo đồ ăn vặt
SELECT favorite_color,
COUNT(*) as total_guests,
SUM(CASE WHEN bringing_snacks THEN 1 ELSE 0 END) as snack_bringers
FROM guests
GROUP BY favorite_color
HAVING SUM(CASE WHEN bringing_snacks THEN 1 ELSE 0 END) > COUNT(*) / 2;

Trong các truy vấn này, chúng ta đang sử dụng HAVING để đảm bảo các nhóm tiệc của chúng ta đáp ứng các tiêu chí nhất định. Điều này giống như đảm bảo mỗi nhóm màu có đủ người và đóng góp vào bể đồ ăn vặt!

Conclusion

Chúc mừng! Bạn đã刚刚迈出了进入 HAVING clause 的世界。记住,当您需要过滤分组数据时,HAVING là người bạn của bạn. Nó giống như một trợ lý thông minh có thể phân tích khách tiệc của bạn sau khi họ đã tạo thành các nhóm màu sắc.

Khi bạn tiếp tục hành trình PostgreSQL của mình, bạn sẽ thấy Clauses HAVING rất hữu ích cho phân tích dữ liệu và báo cáo. Hãy tiếp tục thực hành, và sớm bạn sẽ nhóm và lọc dữ liệu như một chuyên gia!

Chúc may mắn trong việc truy vấn, và hy vọng cơ sở dữ liệu của bạn luôn được tổ chức và các truy vấn của bạn luôn được tối ưu hóa!

Credits: Image by storyset