Mysql中Group By使用Having语句配合查询(where和having区别)
注意 :
having语句一般结合GROUP BY一起使用的。。。。。
Having短语与WHERE的区别!!!
WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。
where是从查询满足条件的数据,用于查询数据之前;having用于在查出的数据中挑选满足条件的数据,在数据查出来之后处理。
select语法的顺序问题:
select 一般在的后面的内容都是要查询的字段 from 要查询到表 where group by having 分组后带有条件只能使用having order by limit 0,100 它必须放到最后面
下面我们举例说明
首先我们创建这么一张表:
简单的介绍一下每一个域的意思: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;
我们来一步一步地剖析这个长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;
那么结果就是每一个组中的第一条记录的SAL,这是没有任何实际意义的,因为这既不是最多的工资,也不是最小的工资,他只是每一个组中的第一条记录对应的SAL
正如我上面所说的一样,31000是BLU这组的第一条记录的SAL,33000是GRE这一组的第一条记录的SAL,32000是RED这一组的第一条记录
看一下查询结果:
所以我们在投影的时候一定要特别注意每一个域的实际意义!
一定要记住这一条规则
SELECT子句中包含集函数
SELECT子句中包含的列:
1、在集函数中的列
2、不在集函数中的列–这些列必须全部包含在GROUP BY子句中。
(即使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数 )
-------------------------另一种解释----------------
聚合函数是比较where、having 的关键。
开门见山。where、聚合函数、having 在from后面的执行顺序:
where>聚合函数(sum,min,max,avg,count)>having
列出group by来比较二者。()因where和having 在使用group by时问的最多)
若须引入聚合函数来对group by 结果进行过滤 则只能用having。(此处不多说,自己想 是先执行聚合函数还是先过滤 然后比对我上面列出的执行顺序 一看便知)
例如:
select sum(score) from student where sex='man' group by name having sum(score)>210
注意事项 :
1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数。
2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
最新文章
- ACM模板(持续补完)
- 基于ionic+cordova+angularJs从零开始搭建自己的移动端H5 APP
- for循环立即执行和不立即执行,js闭包
- sysbench测试服务器性能
- Android--Intent的使用
- WebForm与MVC混用
- javascript异步延时载入及推断是否已载入js/css文件
- 基于ARM的RealView MDK开发环境
- javaweb开发过程中的地址写法
- android sim 卡短信读写
- 判断非法字符串的类方法,与jsp
- 出错信息:Incorrect string value: &#39;\xE4\xBD\xA0\xE5\xA5\xBD&#39; for column &#39;username&#39;
- CSS---内外边距
- Robust Influence Maximization
- 【UVALive - 6534 】Join two kingdoms (树的直径的期望)
- [EXP]CVE-2018-2628 Weblogic GetShell Exploit
- 简明 Vim 练级攻略------转自陈皓coolshell
- 初识Identity(一)
- OOP⑵
- scikit-learn画ROC图
热门文章
- 士兵杀敌 三 --- O( 1 ) 的时间复杂度 .
- [译]libcurl_tutorial
- 【转】Java实现将文件或者文件夹压缩成zip
- 一个用pyton写的监控服务端进程的软件hcm
- 动态排序JavaBean
- servlet——web应用中路径问题
- Exceptions &; Errors - 异常与错误
- CAD二次开发控件,dwg控件,网页DWG控件,手机浏览编辑DWG控件
- js中=,==,===的区别
- Python之UDP编程