• 九、分组查询详解(group by & having)


    本篇内容

    1. 分组查询语法

    2. 聚合函数

    3. 单字段分组

    4. 多字段分组

    5. 分组前筛选数据

    6. 分组后筛选数据

    7. where和having的区别

    8. 分组后排序

    9. where & group by & having & order by & limit 一起协作

    10. mysql分组中的坑

    11. in多列查询的使用

    一、分组查询  

      语法:

      SELECT column, group_function,... FROM table
      [WHERE condition]
      GROUP BY group_by_expression
      [HAVING group_condition];
      说明:    

        group_function:聚合函数。

        group_by_expression:分组表达式,多个之间用逗号隔开。

        group_condition:分组之后对数据进行过滤。

        分组中,select后面只能有两种类型的列:

      1. 出现在group by后的列

      2. 或者使用聚合函数的列

    二、聚合函数
    函数名称作用
    max 查询指定列的最大值
    min 查询指定列的最小值
    count 统计查询结果的行数
    sum 求和,返回指定列的总和
    avg 求平均值,返回指定列数据的平均值

      分组时,可以使用使用上面的聚合函数。

    三、单字段分组

      SELECT 
                user_id 用户id, COUNT(id) 下单数量
            FROM
                t_order
            GROUP BY user_id;

    四、多字段分组

      SELECT 
                user_id 用户id, the_year 年份, COUNT(id) 下单数量
            FROM
                t_order
            GROUP BY user_id , the_year;

    五、分组前筛选数据
      分组前对数据进行筛选,使用where关键字

      SELECT 
                user_id 用户id, COUNT(id) 下单数量
            FROM
                t_order t
            WHERE
                t.the_year = 2018
            GROUP BY user_id;

    六、分组后筛选数据

      分组后对数据筛选,使用having关键字

      SELECT
              user_id 用户id, COUNT(id) 下单数量
            FROM
              t_order t
            WHERE
              t.the_year = 2018
            GROUP BY user_id
            HAVING count(id)>=2;

      SELECT
              user_id 用户id, count(id) 下单数量
            FROM
              t_order t
            WHERE
              t.the_year = 2018
            GROUP BY user_id
            HAVING 下单数量>=2;

    七、where和having的区别  

      where是在分组(聚合)前对记录进行筛选,而having是在分组结束后的结果里筛选,最后返回整个sql的查询结果。

      可以把having理解为两级查询,即含having的查询操作先获得不含having子句时的sql查询结果表,然后在这个结果表上使用having条件筛选出符合的记录,最后返回这些记录,因此,having后是可以跟聚合函数的,并且这个聚集函数不必与select后面的聚集函数相同。

    八、分组后排序

      SELECT
              user_id 用户id, max(price) 最大金额
            FROM
              t_order t
            GROUP BY user_id
            ORDER BY 最大金额 desc;

    九、where & group by & having & order by & limit 一起协作  

      where、group by、having、order by、limit这些关键字一起使用时,先后顺序有明确的限制,语法如下:

      select 列 from 
      表名
      where [查询条件]
      group by [分组表达式]
      having [分组过滤条件]
      order by [排序条件]
      limit [offset,] count;
    --只输出一条记录--
      SELECT
       user_id 用户id, COUNT(id) 下单数量
      FROM
       t_order t
      WHERE
       t.the_year = 2018
      GROUP BY user_id
      HAVING count(id)>=2
      ORDER BY 下单数量 DESC
      LIMIT 1;
    十、
    mysql分组中的坑  

      本文开头有介绍,分组中select后面的列只能有2种:

    1. 出现在group by后面的列

    2. 使用聚合函数的列

      oracle、sqlserver、db2中也是按照这种规范来的。

      建议:在写分组查询的时候,最好按照标准的规范来写,select后面出现的列必须在group by中或者必须使用聚合函数。

    总结

    1. 在写分组查询的时候,最好按照标准的规范来写,select后面出现的列必须在group by中或者必须使用聚合函数

    2. select语法顺序:select、from、where、group by、having、order by、limit,顺序不能搞错了,否则报错。 

  • 相关阅读:
    【Android】6.3 ProgressDialog
    【Android】6.2 AlertDialog(警告对话框)
    【Android】6.1 Toast(信息提示框)
    【Android】6.0 第6章 对话框--本章示例主界面
    【Android】5.8 滑动条(SeekBar)
    Storm Trident API
    Storm Trident状态
    Storm Trident详解
    Storm的并行度
    StormUI详解
  • 原文地址:https://www.cnblogs.com/biao/p/11757542.html
Copyright © 2020-2023  润新知