注意 :

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 条件显示特定的组,也可以使用多个分组标准进行分组。

最新文章

  1. ACM模板(持续补完)
  2. 基于ionic+cordova+angularJs从零开始搭建自己的移动端H5 APP
  3. for循环立即执行和不立即执行,js闭包
  4. sysbench测试服务器性能
  5. Android--Intent的使用
  6. WebForm与MVC混用
  7. javascript异步延时载入及推断是否已载入js/css文件
  8. 基于ARM的RealView MDK开发环境
  9. javaweb开发过程中的地址写法
  10. android sim 卡短信读写
  11. 判断非法字符串的类方法,与jsp
  12. 出错信息:Incorrect string value: &#39;\xE4\xBD\xA0\xE5\xA5\xBD&#39; for column &#39;username&#39;
  13. CSS---内外边距
  14. Robust Influence Maximization
  15. 【UVALive - 6534 】Join two kingdoms (树的直径的期望)
  16. [EXP]CVE-2018-2628 Weblogic GetShell Exploit
  17. 简明 Vim 练级攻略------转自陈皓coolshell
  18. 初识Identity(一)
  19. OOP⑵
  20. scikit-learn画ROC图

热门文章

  1. 士兵杀敌 三 --- O( 1 ) 的时间复杂度 .
  2. [译]libcurl_tutorial
  3. 【转】Java实现将文件或者文件夹压缩成zip
  4. 一个用pyton写的监控服务端进程的软件hcm
  5. 动态排序JavaBean
  6. servlet——web应用中路径问题
  7. Exceptions &amp; Errors - 异常与错误
  8. CAD二次开发控件,dwg控件,网页DWG控件,手机浏览编辑DWG控件
  9. js中=,==,===的区别
  10. Python之UDP编程