A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡章诚 中级黑马   /  2013-6-12 17:30  /  2196 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡章诚 于 2013-6-13 21:43 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

11 个回复

正序浏览
没有什么本质区别,SQL就是这样规定的。。

where是过滤分组之前的信息,而group by是过滤分组之后的信息。。
回复 使用道具 举报
大家说了这么多,我来总结一下:
先用where过滤整张表的数据,后面不能使用统计函数
然后用group对过滤后的数据进行分组,
再用having过滤得到的分组,后面可以使用统计函数

添加一下学习时的总结:
分组后的 select 后面只能加  聚合函数得到的值 或者 group by 的时候使用的字段
回复 使用道具 举报
聚合函数不可以出现在where语句中,
having count(*)>1
having是对分组以后的数据进行过滤,where是对原始数据进行过滤
回复 使用道具 举报
where是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
也就是说,having只能筛选分组后的信息,没有办法处理原始信息。正好它是放在groupby之后了,很好记。

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报

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

      楼上的正解

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报 1 0
啊呀,没想到问出好东西了呀,呵呵,这个貌似很有代表性,后面一串我看懂了,前面的join部分我等下还得学学,这个不怎么熟,

你的意思是这所有的关键字可以按照顺序写一个查询语句出来吗?太神奇了吧?
回复 使用道具 举报
胡章诚 发表于 2013-6-12 18:18
是不是先用where过滤整张表的数据,然后用group对过滤后的数据进行分组,再用having过滤得到的分组
...

对,你说的是对的~~~~
回复 使用道具 举报
胡章诚 发表于 2013-6-12 18:18
是不是先用where过滤整张表的数据,然后用group对过滤后的数据进行分组,再用having过滤得到的分组
...

对头,就是这个样子;
内连接查询顺序:
        select top ...
                from A
                join B
                on ...
                join C
                on ...
                where ...
                group by ...
                having ...
                order by ...
以上这个顺序基本涵盖了查询的全部关键字,按出现的上下顺序排序

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

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

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

回复 使用道具 举报
where:where用在group by的前面,是对整张表内整体信息的过滤,后面不能使用统计函数;
group by:分组,是对where过滤后的信息进行分组;
having:having用在group by的后面,是对分组后的信息过滤,后面可以使用统计函数;
回复 使用道具 举报
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

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马