Trong SQL, HAVING
mệnh đề có thể được sử dụng để chỉ định điều kiện tìm kiếm cho một nhóm hoặc một tổng hợp.
HAVING
mệnh đề thường được sử dụng với GROUP BY
mệnh đề. Trong những trường hợp không, thì có một nhóm tổng hợp, đơn lẻ tiềm ẩn.
HAVING
mệnh đề tương tự như WHERE
, ngoại trừ WHERE
lọc các hàng riêng lẻ, trong khi HAVING
các nhóm bộ lọc. WHERE
mệnh đề lọc dữ liệu trước nó được nhóm lại, trong khi HAVING
lọc dữ liệu sau nó được nhóm lại.
Ví dụ 1 - HAVING
với COUNT()
Giả sử chúng ta có bảng sau:
SELECT * FROM Pets;
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Chúng tôi có thể chạy truy vấn sau đối với bảng này:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Kết quả:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
Trong trường hợp này, chúng tôi đã sử dụng HAVING
mệnh đề kết hợp với GROUP BY
mệnh đề để chỉ trả về những hàng có COUNT(PetTypeId)
lớn hơn 2
. Điều này sử dụng COUNT()
, là một hàm tổng hợp tiêu chuẩn SQL có sẵn trong hầu hết các RDBMS chính.
Nếu chúng ta bỏ qua HAVING
, chúng tôi nhận được một kết quả nữa:
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Kết quả:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Ví dụ 2 - HAVING
với SUM()
Đây là một ví dụ khác. Lần này chúng tôi sử dụng HAVING
mệnh đề với SUM()
, là một hàm tổng hợp khác có sẵn trong hầu hết các RDBMS chính (xem SQLite SUM()
cho một ví dụ khác).
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) > 1000000
ORDER BY CountryCode;
Kết quả:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Ví dụ 3 - HAVING
với IN
Nhà điều hành
Bạn không bị giới hạn chỉ với) Toán tử cho người mới bắt đầu ”> lớn hơn toán tử (>
) khi sử dụng HAVING
mệnh đề. Bạn có thể sử dụng cùng các toán tử mà bạn có thể sử dụng với WHERE
mệnh đề (chẳng hạn như =
, ) Operator for Beginners"><
, =) Operator for Beginners">>=
, IN
, LIKE
, v.v.).
Đây là một ví dụ sử dụng IN
toán tử để chỉ định một phạm vi giá trị tổng hợp sẽ trả về.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) IN (2022000, 3993949, 2990711)
ORDER BY CountryCode;
Kết quả:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Ví dụ 4 - HAVING
không có GROUP BY
Mệnh đề
Mặc dù HAVING
thường được sử dụng với GROUP BY
mệnh đề, nó cũng có thể được sử dụng mà không có nó. Khi được sử dụng mà không có nó, sẽ có một nhóm tổng hợp, đơn lẻ tiềm ẩn.
Kết quả bạn nhận được có thể phụ thuộc vào DBMS của bạn, nhưng đây là một ví dụ được thực hiện trong SQL Server.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Kết quả:
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Ví dụ này chỉ trả về tổng dân số của tất cả các thành phố trong bảng.
Đây là những gì sẽ xảy ra nếu chúng ta hoán đổi toán tử lớn hơn (>
) với toán tử nhỏ hơn (<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Kết quả:
(0 rows affected)