Mysql group by常用操作
1、group by + group_concat()的栗子
group_concat()可以将分组后每个组内的值都显示出来
group_concat()此函数返回一个字符串,是查询结果集合中指定列非NULL值的串联。如果所有列都是NULL,则此函数返回NULL。完整语法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
GROUP_CONCAT 是一个聚合函数,通常跟 GROUP BY 一起使用。
具体用法参见:
1、https://www.jianshu.com/p/df54726d63e9
2、https://www.yangdx.com/2019/02/11.html
2、group by +聚合函数的栗子
有什么聚合函数?
- count():统计记录的条数
- sum():字段值的总和
- max():字段值的最大值
- min():字段值的最小值
- avg():字段值的平均值
3、group by + with rollup的栗子
with rollup用来在所有记录的最后加上一条记录,显示上面所有记录每个字段的总和,通过一个例子来说明把。
表中数据有:
mysql> select * from age; +------+-----------+------+ | sno | sname | sage | +------+-----------+------+ | 1101 | justcode1 | 20 | | 1102 | justcode2 | 21 | | 1103 | justcode3 | 22 | | 1104 | justcode4 | 20 | | 1105 | justcode5 | 21 | | 1106 | justcode6 | 21 | | 1107 | justcode7 | 22 | | 1108 | justcode8 | 22 | +------+-----------+------+ 8 rows in set (0.00 sec) ---------------------
没有with rollup的查询:
mysql> select count(*),sage from age group by sage; +----------+------+ | count(*) | sage | +----------+------+ | 2 | 20 | | 3 | 21 | | 3 | 22 | +----------+------+ 3 rows in set (0.00 sec) ---------------------
带with rollup的查询:
mysql> select count(*),sage from age group by sage with rollup; +----------+------+ | count(*) | sage | +----------+------+ | 2 | 20 | | 3 | 21 | | 3 | 22 | | 8 | NULL | +----------+------+ 4 rows in set (0.00 sec) ---------------------
with rollup 、with cube、grouping
CUBE 和 ROLLUP 之间的区别在于:
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
grouping: 当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。
查看:
3、mysql 统计 group by 之后的 group 的个数
如果将 count(*) 和 group by 一起使用,count(*) 统计的将会是每个 group 里面的行数,而不是 group 的个数。
如果你想统计 group 的个数,需要将 group by 查询放到子查询里面,然后在主查询里面再使用 count(*)。
如下所示,第一个查询的 count(*) 统计的只是特定的 Category 和 Year 下的总行数,而第二个查询才是第一个查询的 group 的个数。
mysql> SELECT tag AS Category, YEAR(created) AS Year, COUNT(*) AS Counts FROM fyi_links GROUP BY tag, YEAR(created); +----------+------+--------+ | Category | Year | Counts | +----------+------+--------+ | DBA | 2005 | 1 | | DBA | 2006 | 2 | | DEV | 2004 | 1 | | DEV | 2006 | 1 | | SQA | 2003 | 1 | | SQA | 2006 | 1 | +----------+------+--------+ 6 rows in set (0.00 sec) mysql> SELECT COUNT(*) FROM ( SELECT tag AS Category, YEAR(created) AS Year, COUNT(*) AS Counts FROM fyi_links GROUP BY tag, YEAR(created) ) groups; +----------+ | COUNT(*) | +----------+ | 6 | +----------+ 1 row in set (0.00 sec)
Group by 相关用法参看:
1、https://www.cnblogs.com/duhuo/p/5110590.html