> For the complete documentation index, see [llms.txt](https://learnsql.gitbook.io/lernmysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learnsql.gitbook.io/lernmysql/welcome-to-the-mysql-tutorial/group-by-va-having.md).

# GROUP BY và HAVING

**Các hàm tập hợp (ví dụ như `SUM`) thông thường cần thêm chức năng của mệnh đề `GROUP BY`.**

**`GROUP BY`...**

Mệnh đề `GROUP BY`...được thêm vào SQL bởi vì các hàm tập hợp (như `SUM`) trả về một tập hợp của các giá trị trong cột mỗi khi chúng được gọi, và nếu không có GROUP BY ta không thể nào tính được tổng của các giá trị theo từng nhóm riêng lẻ trong cột.

Cú pháp của `GROUP BY` như sau:

> `SELECT tên_cột, SUM(tên_cột) FROM tên_bảng GROUP BY tên_cột`

**Ví dụ sử dụng `GROUP BY`:**

Giả sử ta có bảng **Sales** như sau:

| Company   | Amount |
| --------- | ------ |
| W3Schools | 5500   |
| IBM       | 4500   |
| W3Schools | 7100   |

Câu lệnh SQL sau:

> `SELECT Company, SUM(Amount) FROM Sales`

sẽ trả về kết quả:

| Company   | SUM(Amount) |
| --------- | ----------- |
| W3Schools | 17100       |
| IBM       | 17100       |
| W3Schools | 17100       |

Kết quả trả về ở trên đôi khi không phải là cái mà ta mong đợi. Ta thêm mệnh đề `GROUP BY` vào trong câu lệnh SQL:

> `SELECT Company, SUM(Amount) FROM Sales`\
> `GROUP BY Company`

và kết quả trả về lần này sẽ là:

| Company   | SUM(Amount) |
| --------- | ----------- |
| W3Schools | 12600       |
| IBM       | 4500        |

Kết quả này đúng là cái mà ta mong muốn.

**`HAVING`...**

Mệnh đề `HAVING`...được thêm vào SQL vì mệnh đề `WHERE` không áp dụng được đối với các hàm tập hợp (như `SUM`). Nếu không có `HAVING`, ta không thể nào kiểm tra được điều kiện với các hàm tập hợp.

Cú pháp của `HAVING` như sau:

> `SELECT tên_cột, SUM(tên_cột) FROM tên_bảng`\
> `GROUP BY tên_cột`\
> `HAVING SUM(tên_cột) điều_kiện giá_trị`

Ta sử dụng lại bảng **Sales** ở trên. Câu lệnh SQL sau:

> `SELECT Company, SUM(Amount) FROM Sales`\
> `GROUP BY Company`\
> `HAVING SUM(Amount) > 10000`

sẽ trả về kết quả:

| Company   | SUM(Amount) |
| --------- | ----------- |
| W3Schools | 12600       |
