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