zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    CF492B
    CF570B
    CF401C
    CF1190B
    CF413C
    CF486B
    CF976B
    NOIP 2020 解题报告
    状态压缩DP
    区间DP
  • 原文地址:https://www.cnblogs.com/duhuo/p/14829623.html
Copyright © 2011-2022 走看看