mysql中having 与where 的异同点

时间:2017-03-09 08:54:34

[1]having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写

[2]能用where的地方 也能用having ,用haveing的地上 不一定能用where

[实例一]

话说有一个学生成绩表(score),结构如下:

id(记录编号) sid(学生id) chinese(语文成绩) maths(数学成绩) english(英语成绩)

现在有一个需求是:找出语文成绩和数学成绩相差超过30分的同学(教育界称此现象为“偏科”)
SELECT sid,maths,chinese,ABS(chinese-maths) AS bk FROM score WHERE bk>30
mysql返回:Unknown column 'bk' in 'where clause';告诉我们,这样做不可行.
若把where改成having呢?
SELECT sid,maths,chinese,ABS(chinese-maths) AS bk FROM score HAVING bk>30

可喜可贺,成功返回记录集结果如下:

如果,不想用having怎么办呢?
SELECT sid,maths,chinese,ABS(chinese-maths) AS bk FROM score WHERE ABS(chinese-maths)>30

可喜可贺,成功返回记录集结果如下,和使用having达到了一样的效果。

听民间传言,据权威的说法是:
where针对表中的列发挥作用,查询数据

having是对查询结果中得到的列发挥作用,筛选数据(也就是说从查询出的结果集再次进行筛选)

为了更好的理解这句话,来一个where与having并用的sql来体验一下;请继续往下读.
[实例二]
话说有一个学生表(student)结构如下:
id(学生编号) name(姓名) sex(性别)

需求又来了,现在要得到.在数学成绩及格的前提下;计算出男,女的数学平均分各是多少
SELECT sex,AVG(maths) AS avgmaths FROM student,score WHERE student.id= score.sid AND maths>=60 GROUP BY sex

返回记录集如下:

得到了,男生的数学平均分为89.3333;女生的平均分为77.3333(国际惯例,数学当然是男生学的好喽!)
在以上原有需求再加一条,分组后平均分超过80分才显示
SELECT sex,AVG(maths) AS avgmaths FROM student,score WHERE student.id= score.sid AND maths>=60 AND avgmaths > 80 GROUP BY sex
mysql返回:Unknown column 'avgmaths' in 'where clause'
跟据上面的说话可以解释为:where是对表中的列发挥作用,avgmaths并非是表中的原有的列,所以失败了.

SELECT sex,AVG(maths) AS avgmaths FROM student,score WHERE student.id= score.sid AND maths>=60 GROUP BY sex HAVING avgmaths>80

成功返回记录:

haveing是对查询结果中得到的列(avgmaths)发挥作用,又进行了一次筛选。所以成功得到,所需记录。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值