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