mysql group by详解

素颜马尾好姑娘i 2022-09-21 14:22 107阅读 0赞
  1. 在有where和聚合函数的sql中,where的执行速度会在聚合函数之前执行,这就导致聚合函数不会生效。
  2. having的执行速度比聚合函数慢,所以会是先通过聚合函数筛选 having函数过滤
  3. group by 用法解析
  4. group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
  5. SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。
  6. 某个员工信息表结构和数据如下:
  7. id name dept salary edlevel hiredate
  8. 1 张三 开发部 2000 3 2009-10-11
  9. 2 李四 开发部 2500 3 2009-10-01
  10. 3 王五 设计部 2600 5 2010-10-02
  11. 4 王六 设计部 2300 4 2010-10-03
  12. 5 马七 设计部 2100 4 2010-10-06
  13. 6 赵八 销售部 3000 5 2010-10-05
  14. 7 钱九 销售部 3100 7 2010-10-07
  15. 8 孙十 销售部 3500 7 2010-10-06
  16. 例如,我想列出每个部门最高薪水的结果,sql语句如下:
  17. SELECT DEPT, MAX(SALARY) AS MAXIMUM
  18. FROM STAFF
  19. GROUP BY DEPT
  20. 查询结果如下:
  21. DEPT MAXIMUM
  22. 开发部 2500
  23. 设计部 2600
  24. 销售部 3500
  25. 解释一下这个结果:
  26. 1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECTGROUP BY DEPT中包含的列DEPT
  27. 2、“列函数对于GROUP BY子句定义的每个组各返回一个结果”,根据部门分组,对每个部门返回一个结果,就是每个部门的最高薪水。
  28. 注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
  29. 例如,查询每个部门的总的薪水数
  30. SELECT DEPT, sum( SALARY ) AS total
  31. FROM STAFF
  32. GROUP BY DEPT
  33. 查询结果如下:
  34. DEPT total
  35. 开发部 4500
  36. 设计部 7000
  37. 销售部 9600
  38. WHERE 子句与 GROUP BY 子句一起使用
  39. 分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。
  40. 例如,查询公司2010年入职的各个部门每个级别里的最高薪水
  41. SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
  42. FROM staff
  43. WHERE HIREDATE > '2010-01-01'
  44. GROUP BY DEPT, EDLEVEL
  45. ORDER BY DEPT, EDLEVEL
  46. 查询结果如下:
  47. DEPT EDLEVEL MAXIMUM
  48. 设计部 4 2300
  49. 设计部 5 2600
  50. 销售部 5 3000
  51. 销售部 7 3500
  52. 注意:在SELECT语句中指定的每个列名也在GROUP BY子句中提到。未在这两个地方提到的列名将产生错误。
  53. GROUP BY子句对DEPTEDLEVEL的每个唯一组合各返回一行。
  54. GROUP BY子句之后使用HAVING子句
  55. 可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY子句后面包含一个HAVING子句。HAVING子句可包含一个或多个用ANDOR连接的谓词。每个谓词将组特性(如AVG(SALARY))与下列之一进行比较:
  56. 例如:寻找雇员数超过2个的部门的最高和最低薪水:
  57. SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
  58. FROM staff
  59. GROUP BY DEPT
  60. HAVING COUNT( * ) >2
  61. ORDER BY DEPT
  62. 查询结果如下:
  63. DEPT MAXIMUM MINIMUM
  64. 设计部 2600 2100
  65. 销售部 3500 3000
  66. 例如:寻找雇员平均工资大于3000的部门的最高和最低薪水:
  67. SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
  68. FROM staff
  69. GROUP BY DEPT
  70. HAVING AVG( SALARY ) >3000
  71. ORDER BY DEPT
  72. 查询结果如下:
  73. DEPT MAXIMUM MINIMUM
  74. 销售部 3500 3000
  75. select a.id as oid,a.shopid,min(a.price),b.nickname from cnartv_auctionuser as a left join
  76. cnartv_ucenter_member as b on a.uid=b.id where a.shopid=56 group by uid
  77. 连接ucenter_member表获得nickname获得auctionuser表中id=56的最新价根据uid分组
  78. select a.id as orderid,a.shopid,a.shop_name,b.id,b.photo,b.uid,b.price,c.id as userid,c.logo,c.nickname,d.title from (cnartv_crowdorder as a left join cnartv_manyraise as b on a.shopid=b.id ) left join cnartv_ucenter_member as c on b.uid=c.id left join cnartv_crowd as d on a.id=d.id where a.status=1 \G;
  79. 四表连接查询,根据id查询
  80. mysql中的wherehaving的区别
  81. 查询众有用到group by分组查询,此时在用where进行条件筛选时会报错,此时用having是明智之选。
  82. where是对每一列进行判断筛选,having是对结果集进行判断筛选
  83. mysql中,当我们用到聚合函数,如sumcount后,又需要筛选条件时,having就派上用场了,因为WHERE是在聚合前筛选记录的,havinggroup by是组合着用的
  84. 值得注意的是having后面跟的条件判断的字段必须是聚合函数返回的结果,否则sql会报错
  85. having子句在查询过程中慢于聚合语句(sum,min,max,avg,count).而where子句在查询过程中则快于聚合语句(sum,min,max,avg,count)。

发表评论

表情:
评论列表 (有 0 条评论,107人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL GROUP BY

    1. 只会返回分组后的一条结果,但是实际上里面含有的结果不仅有一条 \\![加粗样式][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow

    相关 MYSQLGroup By

    概述 `Group By`即根据其指定的规则对查询数据进行分组,这个分组的意义是对分组内数据进行数据处理,包括SUM、COUNT等等。 这里需要注意的是:`Selec

    相关 mysql group by order by

    这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况 这种需求,我想很多人都遇到过。下面是我模拟我的内容表 复制代码 代码如下: