码迷,mamicode.com
首页 > 数据库 > 详细

Mysql中Group By使用Having语句配合查询

时间:2017-11-14 21:19:12      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:ret   des   出现   描述   http   dep   排列   avg   name   

注意 :

having语句是必须和GROUP BY一起使用的,语句中可以只有GROUP,但是不可以只有Having,当然可以而这可以同时出现的。

Having短语与WHERE的区别!!!
WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。

下面我们举例说明

首先我们创建这么一张表:
技术分享

简单的介绍一下每一个域的意思:JOB—工种、SAL—–工资、DEP—–部门

插入数据:
技术分享

需求:从该表中筛选出工种不是“M” ,以部门来划分平均工资大于28000,按降序排列的记录。

代码:

SELECT  DEP,    JOB,    AVG(SAL)
FROM    EMPL
WHERE   JOB <> ‘M‘
GROUP BY    DEP,    JOB
HAVING  AVG(SAL) > 28000
ORDER BY    3 DESC;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们来一步一步地剖析这个长SQL语句:

第一,from得到的是所有的表中的记录,也就是:
技术分享

第二,where 得到

技术分享

第三步,group by DEP,JOB得到
技术分享

第四步,having avg(SAL)>28000
也就是从所得的五个分组中找出平均工资大于28000的分组,也就是第二、四、五组

技术分享

第五步就是降序排列:(当然SELECT我们一直在使用,其实这以整句的查询是有六个子句的)所以最终结果就是

技术分享

这里有一个值得注意的地方就是,当我们把查询结果的第三个域改为SAL的时候,查询结果会怎么样呢?

SELECT
    DEP,
    JOB,
    SAL
FROM
    EMPL
WHERE
    JOB <> ‘M‘
GROUP BY
    DEP,
    JOB
HAVING
    AVG(SAL) > 28000
ORDER BY
    3 DESC;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

那么结果就是每一个组中的第一条记录的SAL,这是没有任何实际意义的,因为这既不是最多的工资,也不是最小的工资,他只是每一个组中的第一条记录对应的SAL
技术分享

正如我上面所说的一样,31000是BLU这组的第一条记录的SAL,33000是GRE这一组的第一条记录的SAL,32000是RED这一组的第一条记录

看一下查询结果:
技术分享

所以我们在投影的时候一定要特别注意每一个域的实际意义!

一定要记住这一条规则

SELECT子句中包含集函数

SELECT子句中包含的列:
1、在集函数中的列
2、不在集函数中的列–这些列必须全部包含在GROUP BY子句中。

(即使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数 )

Mysql中Group By使用Having语句配合查询

标签:ret   des   出现   描述   http   dep   排列   avg   name   

原文地址:http://www.cnblogs.com/qlqwjy/p/7834571.html

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