having count问题
来源:百度知道 编辑:UC知道 时间:2024/09/12 23:26:51
stuinfo表 sid name 学生信息表
classinfo表 cid name 课程信息表
relation表 sid cid store 选课关联表
问题是 查询选了5门及以上课程的学生id和name
select s.sid,s.[name] from stuinfo s,relation r
where s.sid=r.sid
group by s.sid,s.[name]
having count(r.cid)>=5;
select s.sid,s.[name] from stuinfo s,relation r
where s.sid=r.sid
group by s.sid,s.[name]
having count(r.sid)>=5;
为什么 这两个sql语句是同样的结果呢? 想不通为什么having count(r.cid)>=5;是对的.请高手指点下 谢谢了
classinfo表 cid name 课程信息表
relation表 sid cid store 选课关联表
问题是 查询选了5门及以上课程的学生id和name
select s.sid,s.[name] from stuinfo s,relation r
where s.sid=r.sid
group by s.sid,s.[name]
having count(r.cid)>=5;
select s.sid,s.[name] from stuinfo s,relation r
where s.sid=r.sid
group by s.sid,s.[name]
having count(r.sid)>=5;
为什么 这两个sql语句是同样的结果呢? 想不通为什么having count(r.cid)>=5;是对的.请高手指点下 谢谢了
这两个本来也没什么区别嘛,因为你已经group by s.sid,s.[name] 了
并没有group by r.cid或者r.sid
所以这块两个值的count都是相等的
其实这块标准的不应该这么写,容易误解
如果楼主不相信,那么你试试 having count(*)>=5
结果是一样的!
因为这时候不是要确定有多少字段,而是要确定按名字和学号分组之后,数据有多少行,有一行就是一门课。因此选哪个字段都无关紧要,甚至可以count(*)
,而count(*)是常用用法
因为你的sql中有:【s.sid=r.sid】,所以【having count(s.cid)>=5】和【having count(r.cid)>=5】是等价的。
补充:换句话说就是由于两个表进行的等值连接【s.sid=r.sid】,所以两个having的值是一样的,因为两个表的数据是一一对应的,有几个s.cid就会有几个r.cid。
---
以上,希望对你有所帮助。
因为你查询的时候是根据sid把表s和表r连接起来的,那么count(r.cid)跟count(r.sid)效果就一样了
但是呢,按照需求,推荐第一种写法,count(r.cid)统计课程数一目了然
因为条件where后边已经确定他两个相等了,所以无论哪个 结果都一样了