两种过滤where和having有什么区别

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

两种过滤where和having有什么区别?

已知:select stu_id, sub_id, score, rq from t_score;

STU_ID SUB_ID SCORE RQ

S0001 SUB001 90.00 2008-1-1

S0002 SUB001 80.00 2008-1-1

S0001 SUB002 88.00 2008-2-1

S0002 SUB002 20.00 2008-2-1

S0003 SUB002 0.00 2008-2-1

S0003 SUB001 85.00 2008-1-1

S0099 SUB001 99.00 2008-1-1

S0002 SUB002 60.00 2008-2-1

问题:要求查询最低分在80分以上的记录。

请推算出下面两句的结果,并说出where过滤与having过滤有什么不同之处?

一:select sc.stu_id,min(sc.score)

from t_score sc

where sc.score>=80

group by sc.stu_id

二:select sc.stu_id,min(sc.score)

from t_score sc

group by sc.stu_id

having min(sc.score)>=80

……经过上课详细的推理和分析……

一:结果有4条,而且每条的分数都高手80分(不符合逻辑)

二:结果只有2条(符合逻辑)

结论如下:

where :统计前过滤,过滤的是原始数据(这样参加统计的记录减少了)。having:统计后过滤,过滤的是统计结果(参加统计的记录并没有变化)。

where和having的区别2009-02-19 10:09

分类:数据库

字号:大中小

理解聚集和SQL 的WHERE 和HAVING 子句之间的相互作用是非常重要

的。在WHERE 和HAVING 之间的基本差别是:WHERE 在分组和聚集计算之前选择输入行(因此,它控制哪一行进入聚集计算),而HAVING 在分组和聚集计算之后选择分组行。因此WHERE 子句可能不包含聚集函数;因为试图使用一个聚集来判断那些行需要输入到聚集函数中没有什么意义。另一方面,HAVING 子句总是包含聚集函数。(严格的说,你可以写一个不使用聚集的HAVING 子句,不过是在浪费时间;相同的条件可以在WHERE 阶段更有效地使用。)

HAVING

指定组或聚合的搜索条件。HAVING 只能与SELECT 语句一起使用。通常在GROUP BY 子句中使用它。如果不使用GROUP BY 子句,HAVING 的行为与WHERE 子句一样。

使用HAVING 子句选择行

HAVING 子句对GROUP BY 子句设置条件的方式与WHERE 子句和SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与WHERE 语法类似,但HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表

中出现的任意项。

我知道两者的作用是什么,但有些地方两者都可以用,比如

select studentid, avg(score) from studentScore group by studentid having left(studentid, 1)='0'

select studentid, avg(score) from studentScore where left(studentid, 1)='0' group by studentid

这种情况下哪个会快一点

解析:

select studentid, avg(score) from studentScore group by studentid having left(studentid, 1)='0'

1、分组汇总

2、过滤非法项

left(studentid, 1)='0'是个效率不很高的过滤条件,如果分组会使数据量极大减少(比如每个人有几十门课),而且要过滤掉的只是很小一部分学生,这种写法会有比较高的效率

select studentid, avg(score) from studentScore where left(studentid, 1)='0' group by studentid

1、过滤非法项

2、分组汇总

虽然left(studentid, 1)='0'是个效率不很高的过滤条件,但是如果你要从几百万学生中找到几十个学生3-5门功课的平均分,还是应该很明智的选择它,否则,呵呵,慢慢等分组吧……

总结:不是哪一种写法效率更高,是哪一种写法更符合你的实际情况,分别测试一下就知道了

完了,完了,还是副坛主,还是这里的老师,居然还问这么基础的问题??

Where 是用来指定记录级筛选条件;Having是用来指定分组筛选条件。

别告诉我,你还不理解什么是记录筛选,什么是分组筛选。否则我就受不了了,那么简单。

SQL中WHERE 和HAVING的区别(2008-04-18 13:10:54)

标签:杂谈分类:oracle SQL语句中的Having子句与where子句之区别

在说区别之前,得先介绍GROUP BY这个子句,而在说GROUP子句前,又得先说说“聚合函数”——SQL语言中一种特殊的函数。例如SUM, COUNT, MAX, A VG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

如:

SELECT SUM(population) FROM vv_t_bbc ;

这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。

而通过使用GROUP BY 子句,可以让SUM 和COUNT 这些函数对属于一组的数据起作用。当你指定GROUP BY region 时,只有属于同一个region(地区)的一组数据才将返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过SUM, COUNT等聚合函数运算后返回一个值。

下面再说说“HA VING”和“WHERE”:

HA VING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HA VING子句前;而HA VING子句在聚合后对组记录进行筛选。

让我们还是通过具体的实例来理解GROUP BY 和HA VING 子句:

SQL实例:

相关文档
最新文档