黑马程序员技术交流社区

标题: 关于在sql 里面的where 与having的问题 [打印本页]

作者: 胡章诚    时间: 2013-6-12 17:30
标题: 关于在sql 里面的where 与having的问题
本帖最后由 胡章诚 于 2013-6-13 21:43 编辑

虽然我知道大多数情况用where,在有group by的时候一般用having,但是一直都不是很理解本质区别在哪里

希望大家可以讲一讲各自的理解,他们表达的实质意义是什么?


作者: 许庭洲    时间: 2013-6-12 17:58
1. WHERE子句不仅支持简单的过滤条件还支持复杂的过滤条件;
    例如:用来检索出工资少于5000元或者年龄大于25岁的员工的所有信息:SELECT * FROM T_Employee WHERE  FSalary<5000 OR FAge >25
2. 数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。SQL语句中使用GROUP BY子句进行分组,使用方式为“GROUP BY分组字段".
    例如:查看公司员工有哪些年龄段的
    SELECT FAge FROM T_Employee GROUP BY FAge
3. 有时候需要对部分分组进行过滤,比如只检索人数多余1个的年龄段,
    SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
作者: 蚂蚁搬家    时间: 2013-6-12 18:11
where:where用在group by的前面,是对整张表内整体信息的过滤,后面不能使用统计函数;
group by:分组,是对where过滤后的信息进行分组;
having:having用在group by的后面,是对分组后的信息过滤,后面可以使用统计函数;

作者: 胡章诚    时间: 2013-6-12 18:18
本帖最后由 胡章诚 于 2013-6-12 18:21 编辑
蚂蚁搬家 发表于 2013-6-12 18:11
where:where用在group by的前面,是对整张表内整体信息的过滤,后面不能使用统计函数;
group by:分组, ...

是不是
先用where过滤整张表的数据,
然后用group对过滤后的数据进行分组,
再用having过滤得到的分组


作者: 蚂蚁搬家    时间: 2013-6-12 18:29
胡章诚 发表于 2013-6-12 18:18
是不是先用where过滤整张表的数据,然后用group对过滤后的数据进行分组,再用having过滤得到的分组
...

对头,就是这个样子;
内连接查询顺序:
        select top ...
                from A
                join B
                on ...
                join C
                on ...
                where ...
                group by ...
                having ...
                order by ...
以上这个顺序基本涵盖了查询的全部关键字,按出现的上下顺序排序
作者: yangaidongcumt    时间: 2013-6-12 18:30
胡章诚 发表于 2013-6-12 18:18
是不是先用where过滤整张表的数据,然后用group对过滤后的数据进行分组,再用having过滤得到的分组
...

对,你说的是对的~~~~
作者: 胡章诚    时间: 2013-6-12 18:34
啊呀,没想到问出好东西了呀,呵呵,这个貌似很有代表性,后面一串我看懂了,前面的join部分我等下还得学学,这个不怎么熟,

你的意思是这所有的关键字可以按照顺序写一个查询语句出来吗?太神奇了吧?
作者: ljh4282158    时间: 2013-6-12 18:38

where:where用在group by的前面,是对整张表内整体信息的过滤,后面不能使用统计函数;
group by:分组, having用在group by的后面,是对分组后的信息过滤,后面可以使用统计函数;

      楼上的正解
作者: 蔓越莓    时间: 2013-6-12 19:32
where是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
也就是说,having只能筛选分组后的信息,没有办法处理原始信息。正好它是放在groupby之后了,很好记。


作者: haxyek    时间: 2013-6-12 21:39
聚合函数不可以出现在where语句中,
having count(*)>1
having是对分组以后的数据进行过滤,where是对原始数据进行过滤
作者: 胡章诚    时间: 2013-6-13 08:28
大家说了这么多,我来总结一下:
先用where过滤整张表的数据,后面不能使用统计函数
然后用group对过滤后的数据进行分组,
再用having过滤得到的分组,后面可以使用统计函数

添加一下学习时的总结:
分组后的 select 后面只能加  聚合函数得到的值 或者 group by 的时候使用的字段
作者: 关关雎鸠    时间: 2013-6-13 13:48
没有什么本质区别,SQL就是这样规定的。。

where是过滤分组之前的信息,而group by是过滤分组之后的信息。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2