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个

我们表中的记录很少,因此总计列中到处都是单位。顺便说一句,请注意,我们分组的列越多,结果中的行就越多。