日期:2014-05-17  浏览次数:20482 次

where与having的区别
各位高手,能说一下where 与 having的区别吗?
------最佳解决方案--------------------
ON /WHERE /HAVING是sql语句的3个筛选项,按照t-sql的查询顺序,先on在where再having(前提是用到了这些选项。如果没用到,那顺序就推后)。这里先不说on,where是在单表或者多表关联以后,筛选出符合where子句中出现的数据。也就是使得整个where子句为真的数据。having是要在group by以后才能用。而group by 是对已经通过where筛选出来的数据按照一定规则分组,生成新的临时数据集。然后做最后一次筛选,最后才select出来,最主要的两个区别其实就是:
1、顺序,先where再having
2、where几乎没什么限制条件,但是只有用了group by 才能用having,有时候单纯的where不能筛选出希望的数据,比如要先分组再做筛选,此时就要用having或者其他办法。

t-sql的执行顺序如下图:

------其他解决方案--------------------
虽同为筛选数据,但有以下不同:
1.where 是可以单独使用的,having 是必须配合group by 使用。
2.where 是先过滤数据表 ,having 是先分组 然后过滤数据表。
------其他解决方案--------------------
where 是过滤表连接构成的临时表的数据。
having 则是对分组后的结果进行过滤,分组后的数据只能出现分组条件字段和聚合函数。
所以having后可跟分组的任何一个字段,或者聚合函数表达式,或者他们的条件组合。
------其他解决方案--------------------
where 先过滤数据表,可以单独使用的,
having 先分组,在过滤数据表,必须配合group by 使用 
------其他解决方案--------------------
where是过滤数据“列”,比如where sname='张三',where day='星期三',都是对一些“列”进行刷选。

having 是过滤数据“行”,比如 having count(*)>1,这里需要配合使用group by,group by之后出来一些“行”,加上having count(*)>1就去除了某些“行”的数据

当然得先where sname='' group by '' having ''这是顺序

这是我个人的理解
------其他解决方案--------------------
where 就不多说了,比较自由,但是必须先where后having,having要与group by 联用,对统计结果进行筛选。在having子句中可以使用出现在查询结果列的字段和统计函数,它对查询以及统计运算的结果再做一次筛选,输出满足having筛选的结果。不出现在输出列中但与查询有关的统计也可以在having子句中被使用。
------其他解决方案--------------------
纯属个人理解和看书所得,不保证没有任何漏洞或者不足之处。