日期:2014-05-17  浏览次数:20407 次

常见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,这个是没问题的。