使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位

来源:百度知道 编辑:UC知道 时间:2024/05/16 18:07:34
三张表:
S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN ) C#,CN 分别代表课程编号、课程名称
SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
SELECT SN,SD FROM S WHERE [S#] IN(SELECT [S#] FROM SC RIGHT JOIN C ON SC.[C#]=C.[C#] GROUP BY [S#] HAVING COUNT(*)=COUNT([S#]))

上面是人家给出的案: 可是这一句 COUNT(*)=COUNT([S#]) 我怎么也不明白!
如果是这么理解“s#的行数和sc的总行数相等的所有[s#]列的值 ”是什么意思?不是应该跟课程编号的数量比较吗

这里的count(*)=count(【s#】)是用在having 函数后面的 意思是先用group by对sc表中的[s#]进行排序,然后用having函数选出s#的行数和sc的总行数相等的所有[s#]列的值

可能是这样吧 我表述不清楚或者错误的话请见谅

估计是作者够懒
count(S#)当s#不为空才加1,为空则加0
COUNT(*)=COUNT([S#])应该是就是[S#]不为空,估计作者看到有个group by就顺便用了COUNT(*)=COUNT([S#])
语句也可以写成:
SELECT SN,SD FROM S WHERE [S#] IN(SELECT [S#] FROM SC RIGHT JOIN C ON SC.[C#]=C.[C#] where [S#] is not null GROUP BY [S#])

我不知道他的对不对
白天验证一下

我给你一个看你能看明白不

select s.sn,s.sd from s join
(select s#,count(distinct c#) num from sc group by s#) a
on
a.s#=s.s#
where
a.num=(select count(distinct c#) num from c)