HAVING trong SQL Server

Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng mệnh đề HAVING trong SQL Server để lọc các nhóm dựa trên các điều kiện được chỉ định.

Giới thiệu về mệnh đề HAVING trong SQL Server

Mệnh đề HAVING thường được sử dụng với mệnh đề GROUP BY để lọc các nhóm dựa trên một danh sách các điều kiện. Sau đây minh họa cú pháp mệnh đề HAVING:

SELECT
    select_list
FROM
    table_name
GROUP BY
    group_list
HAVING
    conditions;

Trong cú pháp này, mệnh đề GROUP BY sẽ tổng hợp các bản ghi thành các nhóm và mệnh đề HAVING sẽ áp dụng một hoặc nhiều điều kiện cho các nhóm này.

Chỉ các nhóm thỏa mãn điều kiện trong mệnh đề HAVING mới được bao gồm trong tập kết quả.

Vì SQL Server xử lý mệnh đề HAVING sau mệnh đề GROUP BY, bạn không thể sử dụng bí danh cột để tham chiếu đến các hàm tập hợp được chỉ định trong câu lệnh SELECT. Truy vấn sau đây sẽ thất bại:

SELECT
    column_name1,
    column_name2,
    aggregate_function (column_name3) column_alias
FROM
    table_name
GROUP BY
    column_name1,
    column_name2
HAVING
    column_alias > value;

Thay vào đó, bạn phải sử dụng các hàm tập hợp trực tiếp trong mệnh đề HAVING một cách rõ ràng như sau:

SELECT
    column_name1,
    column_name2,
    aggregate_function (column_name3) alias
FROM
    table_name
GROUP BY
    column_name1,
    column_name2
HAVING
    aggregate_function (column_name3) > value;

Ví dụ về mệnh đề HAVING trong SQL Server

Hãy lấy một số ví dụ để hiểu cách HAVINGhoạt động của mệnh đề.

Sử dụng HAVING với hàm COUNT trong SQL Server

Chúng ta sẽ sử dụng bảng orders trong cơ sở dữ liệu mẫu BikeStores để minh họa:

Bảng orders trong cơ sở dữ liệu mẫu BikeStores

Câu lệnh sau đây sử dụng mệnh đề HAVING để tìm các khách hàng đã đặt ít nhất hai đơn hàng mỗi năm:

SELECT
    customer_id,
    YEAR (order_date),
    COUNT (order_id) order_count
FROM
    sales.orders
GROUP BY
    customer_id,
    YEAR (order_date)
HAVING
    COUNT (order_id) >= 2
ORDER BY
    customer_id;
Sử dụng HAVING với hàm COUNT trong SQL Server

Trong ví dụ này:

  • Đầu tiên, mệnh đề GROUP BY nhóm các đơn đặt hàng theo khách hàng và năm đặt hàng. Hàm COUNT() trả về số lượng đơn đặt hàng mỗi khách hàng được đặt trong mỗi năm.
  • Thứ hai, mệnh đề HAVING sẽ lọc bỏ tất cả các khách hàng có số lượng đơn đặt hàng ít hơn hai.

Sử dụng HAVING với hàm SUM trong SQL Server

Chúng ta sẽ sử dụng bảng order_items trong cơ sở dữ liệu mẫu BikeStores để minh họa:

Bảng order_items trong cơ sở dữ liệu mẫu BikeStores

Câu lệnh sau đây tìm kiếm các đơn đặt hàng có giá trị ròng lớn hơn 20.000:

SELECT
    order_id,
    SUM (
        quantity * list_price * (1 - discount)
    ) net_value
FROM
    sales.order_items
GROUP BY
    order_id
HAVING
    SUM (
        quantity * list_price * (1 - discount)
    ) > 20000
ORDER BY
    net_value;
Sử dụng HAVING với hàm SUM trong SQL Server

Trong ví dụ này:

  • Đầu tiên, hàm SUM trả về giá trị ròng của đơn đặt hàng.
  • Thứ hai, mệnh đề HAVING lọc bỏ tất cả các đơn đặt hàng có giá trị ròng nhỏ hơn hoặc bằng 20.000.

Sử dụng HAVING với hàm MAXMIN trong SQL Server

Chúng ta sẽ sử dụng bảng products trong cơ sở dữ liệu mẫu BikeStores để minh họa:

bảng products trong cơ sở dữ liệu mẫu BikeStores

Câu lệnh sau đây trước tiên tìm giá niêm yết tối đa và tối thiểu trong mỗi loại sản phẩm. Sau đó, nó lọc ra các loại sản phẩm có giá niêm yết tối đa lớn hơn 4.000 hoặc giá niêm yết tối thiểu nhỏ hơn 500:

SELECT
    category_id,
    MAX (list_price) max_list_price,
    MIN (list_price) min_list_price
FROM
    production.products
GROUP BY
    category_id
HAVING
    MAX (list_price) > 4000 OR MIN (list_price) < 500;
Sử dụng HAVING với hàm MAX và MIN trong SQL Server

Sử dụng HAVING với hàm AVG trong SQL Server

Câu lệnh sau đây tìm kiếm các loại sản phẩm có giá niêm yết trung bình nằm trong khoảng từ 500 đến 1.000:

SELECT
    category_id,
    AVG (list_price) avg_list_price
FROM
    production.products
GROUP BY
    category_id
HAVING
    AVG (list_price) BETWEEN 500 AND 1000;
Sử dụng HAVING với hàm AVG trong SQL Server

Trong hướng dẫn này, bạn đã học cách sử dụng mệnh đề HAVING trong SQL Server để lọc các nhóm dựa trên các điều kiện được chỉ định.



Bài viết liên quan:

Tìm hiểu mọi thứ cần biết về trigger trong SQL Server giúp bạn sử dụng trigger hiệu quả nhất.

Tìm hiểu mọi thứ bạn cần biết về function trong SQL Server: bao gồm hàm vô hướng và hàm bảng.

Tìm hiểu mọi thứ bạn cần biết về stored procedure trong SQL Server để tạo và lưu trữ các truy vấn phức tạp.