码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-10-29 11:56:10      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:condition   express   use   总结   --   出现   理解   建议   UNC   

本篇内容

  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,顺序不能搞错了,否则报错。 

 

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

标签:condition   express   use   总结   --   出现   理解   建议   UNC   

原文地址:https://www.cnblogs.com/biao/p/11757542.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!