日期:2014-05-18  浏览次数:20495 次

菜鸟求助一个SQL语句中having用法的区别
select a.S# , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score
from Student a , sc b
where a.S# = b.S#
group by a.S# , a.Sname
having cast(avg(b.score) as decimal(18,2)) >= 60
order by a.S#

select a.S# , a.Sname , avg(score)
from Student a , sc b
where a.S# = b.S#
group by a.S# , a.Sname
having avg(score) >= 60 
order by a.S#
--执行结果一样(都是求得平均成绩大于60分学生的学生编号,姓名,平均成绩)
--having后面为什么要接一个数据类型转换的语句呢?好处在哪里呢

------解决方案--------------------
SQL code
cast(avg(b.score) as decimal(18,2))

--cast转换数据类型的,如果score为varchar转换为int 用于比较
--不是有什么好处,如果知道score就是int类型,就不用cast了

------解决方案--------------------
SQL code

cast('123' as int) --把字符123转为int型

------解决方案--------------------
总结下,score为varchar类型,用第一种;int型,用第二种(也可第一种);
------解决方案--------------------
第一种就是转换了下类型而已,不用考虑score的具体类型,更加严谨吧
------解决方案--------------------
转换为DECIMAL更加精确。
得到的结果是60.00这样的
------解决方案--------------------
SQL code
select a.S# , a.Sname , avg(score)
from Student a , sc b
where a.S# = b.S#
group by a.S# , a.Sname
having avg(score*1.0) >= 60