常见sql面试题 问题
S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名
C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师
SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩
2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
--实现代码:
Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE) FROM S,SC,( Select SNO FROM SC Where SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2 )A Where S.SNO=A.SNO AND SC.SNO=A.SNO GROUP BY S.SNO,S.SNAME
COUNT(DISTINCT CNO)>=2 这个特么的对吗 ?是不是改成 COUNT(SNO)>=2 才对。
Sno Cno Scgrade
1 1 25
2 3 21
-----------------------------
1 2 54
2 2 51
假如 查出来结果集是 横线上面 两条 , 如果查出这样的结果 distinct Cno 后 是 1和3 count后 是2条 ?这样不是满足 >=2吗 ?
这道面试题是不是错了 ?还是我想错了 ? 求指点。
------解决方案--------------------SQL code
select 姓名=S.Sname,avg(SCGRADE) as 平均成绩 from S,SC where S.Sno=SC.Sno and S.Sno in(
select Sno from SC group by Sno having (sum(case when SCGRADE<60 then 1 else 0 end)>=2)
) group by S.Sname
------解决方案--------------------
这道题是没错的,COUNT(DISTINCT column_name) 是指函数返回指定列的不同值的数目的意思,所以
Select SNO FROM SC Where SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2 这句话就是指在sc表里SCGRADE小于60(不及格)和前面查出来的不及格的所有记录,然后用HAVING COUNT(DISTINCT CNO)>=2把里面的一个人选择的课程数量统计出来,置条件大于等于2,这个是没问题的。