Trong SQL, GROUP BY
mệnh đề có thể được sử dụng để chia kết quả của một truy vấn thành các nhóm hàng.
Điều này thường được thực hiện để thực hiện một hoặc nhiều tổng hợp trên mỗi nhóm.
Ví dụ 1
Dưới đây là một ví dụ để chứng minh GROUP BY
mệnh đề.
Lấy bảng sau:
SELECT * FROM Products;
Kết quả:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | 55.99 | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Chúng tôi có thể chạy truy vấn sau đối với bảng đó.
SELECT
VendorId,
COUNT(VendorId) AS Count
FROM Products
GROUP BY VendorId;
Kết quả:
+------------+---------+ | VendorId | Count | |------------+---------| | 1001 | 3 | | 1002 | 1 | | 1003 | 2 | | 1004 | 1 | +------------+---------+
Ở đây, chúng tôi sử dụng COUNT()
hàm tổng hợp để trả về số lượng hàng cho mỗi VendorId
, sau đó là GROUP BY
mệnh đề để nhóm các kết quả.
Ví dụ 2
Trong ví dụ này, chúng tôi sử dụng SUM()
hàm tổng hợp để trả về dân số tổng hợp của tất cả các thành phố trong một quận, sau đó là GROUP BY
mệnh đề để nhóm các kết quả.
Hãy tưởng tượng chúng ta có một bảng tên là City
lưu trữ tên thành phố và dân số của chúng, cũng như mã quốc gia và quận tương ứng của chúng (trong các cột riêng biệt của chúng).
Như thế này:
SELECT * FROM city
WHERE CountryCode IN ('AGO', 'ARE', 'AUS');
Kết quả:
+------+---------------+---------------+-----------------+--------------+ | ID | Name | CountryCode | District | Population | |------+---------------+---------------+-----------------+--------------| | 56 | Luanda | AGO | Luanda | 2022000 | | 57 | Huambo | AGO | Huambo | 163100 | | 58 | Lobito | AGO | Benguela | 130000 | | 59 | Benguela | AGO | Benguela | 128300 | | 60 | Namibe | AGO | Namibe | 118200 | | 64 | Dubai | ARE | Dubai | 669181 | | 65 | Abu Dhabi | ARE | Abu Dhabi | 398695 | | 66 | Sharja | ARE | Sharja | 320095 | | 67 | al-Ayn | ARE | Abu Dhabi | 225970 | | 68 | Ajman | ARE | Ajman | 114395 | | 130 | Sydney | AUS | New South Wales | 3276207 | | 131 | Melbourne | AUS | Victoria | 2865329 | | 132 | Brisbane | AUS | Queensland | 1291117 | | 133 | Perth | AUS | West Australia | 1096829 | | 134 | Adelaide | AUS | South Australia | 978100 | | 135 | Canberra | AUS | Capital Region | 322723 | | 136 | Gold Coast | AUS | Queensland | 311932 | | 137 | Newcastle | AUS | New South Wales | 270324 | | 138 | Central Coast | AUS | New South Wales | 227657 | | 139 | Wollongong | AUS | New South Wales | 219761 | | 140 | Hobart | AUS | Tasmania | 126118 | | 141 | Geelong | AUS | Victoria | 125382 | | 142 | Townsville | AUS | Queensland | 109914 | | 143 | Cairns | AUS | Queensland | 92273 | +------+---------------+---------------+-----------------+--------------+
Tôi đã giảm kết quả xuống chỉ còn ba quốc gia, nếu không danh sách sẽ là cách quá dài cho bài viết này.
Bây giờ, giả sử chúng tôi muốn lấy dân số của từng quận và chúng tôi muốn liệt kê từng quận, cùng với dân số và mã quốc gia của nó.
Chúng tôi có thể làm điều này.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
ORDER BY CountryCode;
Kết quả:
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Benguela | 258300 | | AGO | Huambo | 163100 | | AGO | Luanda | 2022000 | | AGO | Namibe | 118200 | | ARE | Abu Dhabi | 624665 | | ARE | Ajman | 114395 | | ARE | Dubai | 669181 | | ARE | Sharja | 320095 | | AUS | Capital Region | 322723 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | South Australia | 978100 | | AUS | Tasmania | 126118 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Chúng tôi có thể thấy rằng kết quả của chúng tôi được nhóm lại như đã chỉ định và giờ đây chúng tôi có được dân số đầy đủ cho mỗi quận (trái ngược với dân số của các thành phố riêng lẻ, đó là cách chúng được lưu trữ trong bảng bên dưới).
Lưu ý rằng GROUP BY
mệnh đề phải đứng sau WHERE
bất kỳ và trước bất kỳ ORDER BY
nào mệnh đề.
Nếu chúng tôi muốn lấy dân số của mỗi quốc gia thay vì huyện, truy vấn của chúng tôi thậm chí còn trở nên nhỏ gọn hơn.
SELECT
CountryCode,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode
ORDER BY CountryCode;
Kết quả:
+---------------+--------------+ | CountryCode | Population | |---------------+--------------| | AGO | 2561600 | | ARE | 1728336 | | AUS | 11313666 | +---------------+--------------+
Lưu ý rằng cơ sở dữ liệu mẫu cụ thể này đã rất cũ và số lượng dân số của nó không phản ánh thực tế hiện tại.
Ví dụ 3 - Mệnh đề HAVING
Bạn có thể bao gồm HAVING
với GROUP BY
của bạn mệnh đề để lọc các nhóm.
Ví dụ:
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 | +---------------+-----------------+--------------+
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.
Ngoài ra, 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.
HAVING
mệnh đề chấp nhận 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.).