Mysql中Group By使用Having语句配合查询
Posted Qiao_Zhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql中Group By使用Having语句配合查询相关的知识,希望对你有一定的参考价值。
注意 :
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语句配合查询的主要内容,如果未能解决你的问题,请参考以下文章
MySQL笔记--- 部分 DQL 语句;条件查询;排序;分组函数;单行处理函数;group by ,having ;
mysql中“group by、having、order by、limit”的顺序及用法是啥?