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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李贤贤 中级黑马   /  2013-3-9 09:13  /  2752 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

where和having两者的主要区别是什么?

评分

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

查看全部评分

7 个回复

倒序浏览
where作用于基本表或视图,作用流程是依次选择每一条记录;而having作用于组,是结合group by使用的,它的作用流程是依次选择group by分组的每一组。【例子】学生选课,是多对多的情况,现在要查询平均分在80分以上的课程。①用having:sele 课程 from 学生选课 group by 课程 having avg(成绩)>=80&&计算机先分组,再计算各组平均分,选出符合条件的→正确结果。②用where:sele 课程 from 学生选课 where avg(成绩)>=80 group by 课程&&计算机直接对所有学生记录计算平均分,然后试图进行分组、选择→结果你自己试试吧!

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 张洪慊 于 2013-3-9 09:44 编辑

1.where 查询满足指定条件的元组(行)
例如:
---查询学生表中年龄<20的学生的姓名和年龄
select Sname,Sage from Student where Sage<20
但是不能把where换成having
2.了解下group by
group by 将查询结果 按某一列或 多列的值分组,值相等的为一组
例如:
我想知道在一个班中男生有多少人.
select count(*),Ssex from Student
group by Ssex     ---分成'男'的一组,'女'的一组
having Ssex='男'   --对分完的组进行筛选-->我只要男的一组
总结:where子句与having 短语的区别在于作用对象不同.where子句作用对于基本表或视图,
       从中选择满足条件的元组(行).having短语作用于组,从中选择满足条件的组.

       having与group by连用,如果用group by,一般有聚合函数(count,sum,avg...).

评分

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

查看全部评分

回复 使用道具 举报
where是sql中的一个指令,一般用于规定选择的标准指定用于限制返回的行的搜索条件,是有条件地从表中选取数据,跟在select后面,只有满足条件的数据才会查询显示出来

在 sql中增加 having子句原因是,where 关键字无法与聚合函数一起使用。having  用于对group by语句后的数据进行条件筛选。所以还是where更为普遍的。遇到group by 可以考虑使用having,可以减少因聚合函数产生的错误
回复 使用道具 举报
郝滨 发表于 2013-3-9 09:40
where是sql中的一个指令,一般用于规定选择的标准指定用于限制返回的行的搜索条件,是有条件地从表中选取数 ...

遇到聚合函数时就用having进行筛选还是只有在group by中用?
回复 使用道具 举报
张洪慊 发表于 2013-3-9 09:39
1.where 查询满足指定条件的元组(行)
例如:
---查询学生表中年龄

谢谢举例说明哈
回复 使用道具 举报
李贤贤 发表于 2013-3-9 09:44
谢谢举例说明哈

where 关键字无法与聚合函数一起使用,注意同学的这句话.
也就是说你不能where count(*)>3..
个人理解:
需要分组的话-->group by
                       ---->需要对分完的组进行筛选-->having
建议你做大量练习加深理解
回复 使用道具 举报
本帖最后由 杞文明 于 2013-3-9 10:32 编辑

下面我以前整理的笔记 : 也许对你有用
  1. /*
  2. 2012年11月20日 星期二 10:14:07
  3. 目的:
  4. 功能:
  5. 说明:
  6. having的所有用法
  7. 1、
  8. having字句是用来对分组之后的数据进行过滤
  9. 因此使用having时通常都会先使用group by
  10. 2、
  11. 如果没有使用group by 但使用了having
  12. 则意味着having白所有的记录当做一组记录进行过滤
  13. 3、
  14. having字句出现的字段必须是分组之后的组的整体信息
  15. having字句不允许出现组内的详细信息
  16. 4、
  17. 尽管select字段中可以出现别名
  18. 但是having子句中不能出现字段的别名,只能使用最原始的名字
  19. 5、相同点:
  20.        1、where和having都是对数据进行过滤只保留有效数据
  21.        2、不允许出现别名
  22. 不同点
  23.    where 对原始数据过滤
  24.    having 对分组后的数据进行过滤
  25. */


  26. --2的例子 很少用
  27. use scott
  28. go
  29. select count(*) from emp
  30. having avg(sal)>1000







  31. /*
  32. 2012年11月20日 星期二 9:41:56
  33. 目的:
  34. 功能:
  35. 说明:
  36. 相同点:
  37. where和having都是对数据进行过滤
  38. 不同点:
  39. where 对原始数据过滤
  40. having 对分组后的数据进行过滤
  41. */


  42. --把姓名不包含A的所有的员工按部门编号分组
  43. --统计输出部门平均工资大于2000的部门的部门编号 部门的平均工资
  44. use scott
  45. go
  46. --以下是没有过滤名字的
  47. select deptno "部门编号",avg(sal)"平均工资" from emp
  48. group by deptno
  49. having avg(sal)>2000

  50. --以下是过滤了名字的
  51. select deptno "部门编号",avg(sal)"平均工资" from emp
  52. where ename not like '%A%'
  53. group by deptno
  54. having avg(sal)>2000


  55. --统计输出部门平均工资大于3000的部门的部门编号 部门的平均工资no
  56. select deptno "部门编号",avg(sal) "平均工资",
  57. count(*)"部门人数", max(sal)"最大工资",
  58. min(sal)"最小工资" from emp
  59. where sal>2000 --对原始数据过滤
  60. group by deptno
  61. having avg(sal)>3000 --对分组后的数据
复制代码

评分

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

查看全部评分

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