4.1 Nhóm các cột

Điều cũng rất quan trọng là nếu bạn nhóm các bản ghi, thì trong phần này, SELECTbạn chỉ có thể chỉ định các cột theo đó dữ liệu được nhóm.

Bạnkhông thểviết một truy vấn loại và chỉ định SELECTcột tên trong phần :

SELECT brand, name
FROM product
GROUP BY brand

Bạn có nhiều hàng trong bảng sản phẩm có trường tên và không rõ bạn cần thay thế hàng nào ở đây. Hãy suy nghĩ lại: bạn muốn biết số lượng sản phẩm của từng thương hiệu và làm thế nào bảng kết quả có thể lấy tên của sản phẩm?

Nếu bạn sử dụng toán tử GROUP BY, thì các hàng thông thường không thể đưa vào kết quả của bạn mà chỉ các cột theo đó dữ liệu được nhóm và "các cột được tính toán", chẳng hạn nhưCOUNT(*)

4.2 Nhóm theo các cột được tính toán

Nhưng bạn có thể nhóm theo nhiều cột và thậm chí theo các cột được tính toán. Ví dụ:

SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year

Và kết quả của truy vấn này:

thuê_năm tổng cộng
2012 1
2013 1
2014 1
2015 2
2018 1

Hãy phân tích yêu cầu của chúng tôi.

Trong bảng employee , mỗi nhân viên có một ngày thuê duy nhất, vì vậy việc nhóm dữ liệu theo ngày đó sẽ không hiệu quả - sẽ có một bản ghi cho mỗi ngày và việc nhóm sẽ không có nhiều ý nghĩa. Nhưng nếu chúng ta chuyển từ ngày tuyển dụng sang năm tuyển dụng, thì có thể xảy ra trường hợp công ty thuê nhiều nhân viên trong cùng một năm.

Hãy xem lại bảng này trông như thế nào trước khi nhóm:

SELECT
 	id,
 	name,
 	YEAR(join_date) AS hire_year,
 	join_date
FROM employee

Và kết quả của truy vấn này:

nhận dạng tên thuê_năm ngày tham gia
1 Ivanov Ivan 2012 30-06-2012
2 Petrov Petr 2013 2013-08-12
3 Ivanov Serge 2014 2014-01-01
4 Rabinovich Moisha 2015 2015-05-12
5 kirienko anastasia 2015 2015-10-10
6 Vaska 2018 2018-11-11

Nhưng bảng kết quả này có thể được nhóm theo thuê_năm và tìm hiểu xem có bao nhiêu người được thuê trong một năm cụ thể.

4.3 Nhóm theo nhiều cột

Bây giờ chúng ta hãy thử tìm xem chúng ta đã thuê bao nhiêu nhân viên trong mỗi tháng của mỗi năm. Để thực hiện việc này, chúng ta cần thêm không chỉ một mà là hai trường được tính toán vào truy vấn cùng một lúc - năm thuê (hire_year) và tháng thuê (hire_month).

Hãy viết một truy vấn như thế này:

SELECT
 	id,
 	name,
 	YEAR(join_date) AS hire_year,
 	MONTH(join_date) AS hire_month,
 	join_date
FROM employee

Và kết quả của truy vấn này:

nhận dạng tên thuê_năm thuê_tháng ngày tham gia
1 Ivanov Ivan 2012 6 30-06-2012
2 Petrov Petr 2013 số 8 2013-08-12
3 Ivanov Serge 2014 1 2014-01-01
4 Rabinovich Moisha 2015 5 2015-05-12
5 kirienko anastasia 2015 10 2015-10-10
6 Vaska 2018 mười một 2018-11-11

Nếu chúng ta nhóm dữ liệu trong bảng kết quả này theo tháng, thì chúng ta chỉ cần nhóm mọi người thành các nhóm, bất kể họ được thuê vào năm nào. Và chúng ta cần bảng kết quả có ba cột: năm, tháng và số lượng nhân viên được thuê.

Để làm điều này, sau toán tử, GROUP BYbạn cần sử dụng tên của không phải một cột mà là hai cột. Ví dụ:

SELECT
 	YEAR(join_date) AS hire_year,
 	MONTH(join_date) AS hire_month,
 	COUNT(*) AS total
FROM employee
GROUP BY hire_year, hire_month

Và kết quả của truy vấn này:

thuê_năm thuê_tháng tổng cộng
2012 6 1
2013 số 8 1
2014 1 1
2015 5 1
2015 10 1
2018 mười một 1

Chúng tôi có ít bản ghi trong bảng, vì vậy có các đơn vị ở khắp mọi nơi trong cột tổng. Và nhân tiện, hãy lưu ý rằng chúng ta nhóm càng nhiều cột thì càng có nhiều hàng trong kết quả.