采用数据表字段如下:
student表:sid学号,sname姓名
course课程表:cid课程号,sname课程名
sc成绩表:sid学号,cid课程号,score成绩
注意:这里是查询选修课程与01号同学完全一样的其他学生信息,网上大多数给出的都是选修课程包含01号同学所选修课程的学生信息。
比如01号同学选修了 C语言、数据库、数据结构,那么我们要找的同学就要选修 C语言、数据库、数据结构,不能多也不能少,完全一致。注意:这里用课程名方便理解和表述,实际编写sql我们都用课程号cid。
核心思路:先找出选修课程包含了01号同学所选修全部课程的学生信息,在这基础上,在用having语句筛选出选修数量与01号同学一样的学生,即先’大于等于’再‘等于‘。
我们首先用not exists语句来完成第一步(不清楚not exists的要先学一样,稍微有点复杂。当然也有其他方法完成这一步)
这里方便直观显示学生信息,所以对student表进行查询。
--查询选修课程包含了‘01号学生所选修全部的课程’的学生信息
select * from Student
where not exists(select * from SC a where SId='01' and not exists( select * from SC b where a.CId=b.CId and Student.SId=b.SId))
在此基础上,进行选课数量与01号同学一样的其他学生(不包括01号学生)。
只是在上面的代码中外套了一层查询和分组(上面是对student表查询,这里为了书写简单,对SC表进行查询)
--查询选修课程与01号同学完全一样的其他学生信息
select sid from(
select * from SC sc
where not exists(select * from SC a where SId='01' and not exists( select * from SC b where a.CId=b.CId and sc.SId=b.SId))
) abc
where SId!='01'
group by SId
having COUNT(*)=(select COUNT(*) from SC where SId='01')
这里最终结果只显示学号,要显示完整学生信息,与学生表进行内连接即可。
可以把01号同学换成其它学号试试,建议自己插入两条SC成绩表记录,学号22的学生选修了C语言、数据库,学号33的学生也选修了C语言、数据库(写SQL时这里的课程名用课程号代替),且只有他们两个选修课程是完全一致的,把上述01换成22或33,验证结果是否正确。