MySQL - Câu lệnh Having

Xin chào các bạn đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng tìm hiểu một tính năng mạnh mẽ của MySQL: câu lệnh HAVING. Là người dạy khoa học máy tính gần gũi của bạn, tôi rất vui được hướng dẫn bạn trong hành trình này. Đừng lo lắng nếu bạn mới bắt đầu học lập trình; chúng ta sẽ cùng nhau từng bước, và sớm bạn sẽ có thể lọc dữ liệu như một chuyên gia!

MySQL - Having Clause

MySQL Having Clause

Hãy bắt đầu từ những điều cơ bản. Câu lệnh HAVING giống như một bảo vệ tại câu lạc bộ, nhưng thay vì kiểm tra thẻ căn cước, nó kiểm tra các nhóm dữ liệu. Nó được sử dụng cùng với câu lệnh GROUP BY để lọc các bản ghi đã nhóm lại thỏa mãn một điều kiện cụ thể.

Hãy tưởng tượng bạn đang sắp xếp bộ truyện tranh của mình. Bạn đã nhóm chúng theo siêu anh hùng,但现在 bạn chỉ muốn xem những anh hùng xuất hiện trong hơn năm truyện tranh. Đó là lúc HAVING phát huy tác dụng!

Dưới đây là cú pháp cơ bản:

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

Hãy xem một ví dụ đơn giản. Giả sử chúng ta có một bảng叫做 employees:

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

Truy vấn này sẽ hiển thị tất cả các phòng ban có hơn 10 nhân viên. Câu lệnh HAVING đang kiểm tra employee_count sau khi việc nhóm đã được thực hiện.

Khi nào nên sử dụng WHERE vs HAVING

Bạn có thể đang nghĩ, "Đợi đã, thầy! Đâu phải WHERE cũng làm điều này?" Câu hỏi tuyệt vời! Dưới đây là sự khác biệt chính:

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

Hãy tưởng tượng WHERE là kiểm tra an ninh ban đầu, và HAVING là danh sách VIP tại buổi tiệc sau!

Câu lệnh HAVING với câu lệnh ORDER BY

Bây giờ, hãy thêm một chút trật tự vào kết quả của chúng ta. Câu lệnh ORDER BY giống như người usher tại một nhà hát, đảm bảo mọi người đều ngồi đúng chỗ.

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

Truy vấn này sẽ hiển thị các phòng ban có mức lương trung bình trên 50.000 đô la, được sắp xếp từ cao đến thấp. Đó giống như tạo một danh sách "người chơi lớn" cho công ty của bạn!

Câu lệnh HAVING với hàm COUNT()

Hàm COUNT() là công cụ tính toán đáng tin cậy của bạn. Hãy sử dụng nó để tìm các quản lý bận rộn:

SELECT manager_id, COUNT(*) as team_size
FROM employees
GROUP BY manager_id
HAVING team_size > 5
ORDER BY team_size DESC;

Truy vấn này liệt kê các quản lý có hơn 5 thành viên trong đội. Đó giống như tìm ra ai là giáo viên có lớp học lớn nhất!

Câu lệnh HAVING với hàm AVG()

Hàm AVG() là người bạn hàng xóm thân thiện của bạn, người tính toán平均值. Hãy sử dụng nó để tìm các nhóm sản phẩm có hiệu suất cao:

SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
HAVING avg_price > 100
ORDER BY avg_price DESC;

Truy vấn này hiển thị các nhóm sản phẩm có giá trung bình trên 100 đô la. Đó giống như xác định các phần sang trọng trong một cửa hàng bách hóa!

Câu lệnh HAVING với hàm MAX()

Hàm MAX() giống như người nhảy cao冠军 của dữ liệu của bạn. Hãy sử dụng nó để tìm sản phẩm đắt nhất trong mỗi nhóm:

SELECT category, MAX(price) as max_price
FROM products
GROUP BY category
HAVING max_price > 1000
ORDER BY max_price DESC;

Truy vấn này liệt kê các nhóm có ít nhất một sản phẩm có giá trên 1000 đô la. Đó giống như tìm các mặt hàng "đắt đỏ" trong mỗi bộ phận!

Sử dụng câu lệnh HAVING với chương trình khách

Bây giờ, hãy áp dụng tất cả những điều này vào thực tế bằng cách sử dụng một chương trình khách MySQL. Tôi sẽ sử dụng ví dụ kinh điển về cơ sở dữ liệu nhà sách:

-- Tạo bảng books
CREATE TABLE books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(50),
genre VARCHAR(50),
price DECIMAL(5,2),
sold INT
);

-- Chèn một số dữ liệu mẫu
INSERT INTO books (title, author, genre, price, sold) VALUES
('The Great Gatsby', 'F. Scott Fitzgerald', 'Classic', 12.99, 1000),
('To Kill a Mockingbird', 'Harper Lee', 'Classic', 14.99, 1500),
('1984', 'George Orwell', 'Sci-Fi', 11.99, 2000),
('Pride and Prejudice', 'Jane Austen', 'Romance', 9.99, 1800),
('The Hobbit', 'J.R.R. Tolkien', 'Fantasy', 19.99, 2500),
('Harry Potter', 'J.K. Rowling', 'Fantasy', 24.99, 5000),
('The Catcher in the Rye', 'J.D. Salinger', 'Classic', 13.99, 1200);

-- Bây giờ hãy sử dụng HAVING để phân tích doanh số bán sách của chúng ta
SELECT genre, AVG(price) as avg_price, SUM(sold) as total_sold
FROM books
GROUP BY genre
HAVING total_sold > 2000
ORDER BY total_sold DESC;

Truy vấn này sẽ hiển thị các thể loại đã bán hơn 2000 sách, kèm theo giá trung bình. Đó giống như tìm ra các phần bán chạy nhất trong nhà sách của chúng ta!

Dưới đây là phân tích những gì đang xảy ra:

  1. Chúng ta chọn thể loại, tính giá trung bình và tổng doanh số.
  2. Chúng ta nhóm kết quả theo thể loại.
  3. Câu lệnh HAVING lọc bỏ các thể loại có tổng doanh số 2000 hoặc ít hơn.
  4. Cuối cùng, chúng ta sắp xếp kết quả theo doanh số bán ra giảm dần.

Và thế là xong! Bạn đã sử dụng câu lệnh HAVING để thu được những thông tin quý giá từ dữ liệu của mình. Nhớ rằng, thực hành là cách tốt nhất để trở nên hoàn hảo, vì vậy đừng ngần ngại thử nghiệm với các truy vấn của riêng bạn.

Dưới đây là bảng tham khảo nhanh các hàm chúng ta đã sử dụng với HAVING:

Hàm Mô tả Ví dụ
COUNT() Đếm số lượng hàng trong một nhóm HAVING COUNT(*) > 5
AVG() Tính giá trị trung bình của một tập giá trị HAVING AVG(price) > 100
MAX() Trả về giá trị lớn nhất trong một tập HAVING MAX(price) > 1000
SUM() Tính tổng của một tập giá trị HAVING SUM(sold) > 2000

Chúc mừng các bạn tương lai trở thành phù thủy dữ liệu!

Credits: Image by storyset