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。

查看:

1、https://justcode.ikeepstudying.com/2019/03/mysql-%E5%88%86%E7%BB%84%E8%AE%A1%E6%B1%87-mysql%E4%B8%ADwith-rollup%E7%9A%84%E7%94%A8%E6%B3%95-group-by%E6%B1%87%E6%80%BB/

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

 

Mysql group by常用操作

上一篇:spark连接mysql数据库


下一篇:oracle distinct用法