Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Mệnh đề GROUP BY trong SQL dành cho người mới bắt đầu

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.).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách cài đặt và cấu hình Zabbix trên Ubuntu 20.04

  2. Phân tích cú pháp các giá trị mặc định của tham số bằng PowerShell - Phần 3

  3. Cách lọc bản ghi bằng hàm tổng hợp AVG

  4. Xu hướng phần cứng máy chủ cơ sở dữ liệu

  5. Ký hiệu IDEF1X