4.1 分組列

同樣非常重要的是,如果您對記錄進行分組,那麼在該部分中SELECT您只能指定數據分組所依據的列。

不能編寫類型查詢並在部分中指定名稱SELECT列:

SELECT brand, name
FROM product
GROUP BY brand

您在product表中有一堆帶有name field 的行,並且不清楚您需要在此處替換哪一行。再想想:你想知道每個品牌的產品數量,結果表怎麼才能得到產品名稱?

如果您使用 operator GROUP BY,則普通行無法進入您的結果,而只能進入數據分組所依據的列和“計算列”,例如COUNT(*)

4.2 按計算列分組

但是您可以按多列分組,甚至可以按計算列分組。例子:

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

這個查詢的結果是:

hire_year 全部的
2012 1個
2013 1個
2014 1個
2015年 2個
2018 1個

讓我們分析一下我們的請求。

employee表中,每個員工都有一個唯一的僱傭日期,因此按它分組數據是行不通的——每個日期都有一條記錄,分組沒有多大意義。但是如果我們從招聘日期移到招聘年份,那麼很可能是公司在同一年招聘了好幾名員工的情況。

讓我們再看看這個表在分組之前會是什麼樣子:

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

這個查詢的結果是:

ID 姓名 hire_year 加入日期
1個 伊万諾夫伊万 2012 2012-06-30
2個 彼得羅夫彼得 2013 2013-08-12
3個 伊万諾夫謝爾蓋 2014 2014-01-01
4個 拉比諾維奇·莫伊沙 2015年 2015-05-12
5個 基連科阿納斯塔西婭 2015年 2015-10-10
6個 瓦斯卡 2018 2018-11-11

但是這個結果表可以按hire_year分組,並找出特定年份僱用了多少人。

4.3 多列分組

現在讓我們試著找出我們每年每個月僱傭了多少員工。為此,我們需要一次向查詢添加兩個計算字段,而不是一個 - 僱用年份 (hire_year) 和僱用月份 (hire_month)。

讓我們寫一個這樣的查詢:

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

這個查詢的結果是:

ID 姓名 hire_year hire_month 加入日期
1個 伊万諾夫伊万 2012 6個 2012-06-30
2個 彼得羅夫彼得 2013 8個 2013-08-12
3個 伊万諾夫謝爾蓋 2014 1個 2014-01-01
4個 拉比諾維奇·莫伊沙 2015年 5個 2015-05-12
5個 基連科阿納斯塔西婭 2015年 10 2015-10-10
6個 瓦斯卡 2018 十一 2018-11-11

如果我們按月對這個結果表中的數據進行分組,那麼我們只是將人員分組,而不管他們被雇用的年份。我們需要結果表包含三列:年、月和僱用的員工人數。

為此,在運算符之後,GROUP BY您需要使用的名稱不是一列,而是兩列。例子:

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

這個查詢的結果是:

hire_year hire_month 全部的
2012 6個 1個
2013 8個 1個
2014 1個 1個
2015年 5個 1個
2015年 10 1個
2018 十一 1個

我們表中的記錄很少,因此總計列中到處都是單位。順便說一句,請注意,我們分組的列越多,結果中的行就越多。