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, SELECT
bạ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 SELECT
cộ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 BY
bạ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ả.