如下题:
设关系模式:Student(Sid,Sname)其中id为主键,SC(Sid,Cid,grade)其中主键(Sid,Cid),外键(Sid,Cid);
Sid为学生学号,Sname为学生姓名,Cid为课程编号,grade为课程分数1.查询只选修了2号课程的学生学号
2.查询除了2号课程还选了其他课程的学生学号
3.查询选修了课程但没有选2号课程的学生学号
4.查询没有选修2号课程的学生的姓名。小弟接触mysql时间不长,只会Select的简单查询,恳求高手解答。
设关系模式:Student(Sid,Sname)其中id为主键,SC(Sid,Cid,grade)其中主键(Sid,Cid),外键(Sid,Cid);
Sid为学生学号,Sname为学生姓名,Cid为课程编号,grade为课程分数1.查询只选修了2号课程的学生学号
2.查询除了2号课程还选了其他课程的学生学号
3.查询选修了课程但没有选2号课程的学生学号
4.查询没有选修2号课程的学生的姓名。小弟接触mysql时间不长,只会Select的简单查询,恳求高手解答。
----先声明,我是菜鸟,而且许久没有写过SQL了。
1.查询只选修了2号课程的学生学号select a.sid from SC a left join SC b on a.sid=b.sid
where a.cid='2号课程' group by a.sid having count(a.sid)=1;
----方法有多个,这个算是一个吧。2.查询除了2号课程还选了其他课程的学生学号
select a.sid from SC a left join SC b on a.sid=b.sid
where a.cid='2号课程' group by a.sid having count(a.sid)>1;
3.查询选修了课程但没有选2号课程的学生学号
select sid from SC
minus
select sid from SC where cid='002'4.查询没有选修2号课程的学生的姓名。----这个可能会有学生是什么课程也没有选的,所以使用左链接。
select sname from Student s left join sc on s.sid=sc.sid
where sc.sid in
(select sid from SC
minus
select sid from SC where cid='002');
-----使用in的性能不好,-_-||
----没有验证,不知可否。
嗯,很不错,我自己也写了一下:
1.select sid from sc where cid='2' and exist
(select sid,count(sid) from sc group by sid having count(sid)=1);
2.语句和1一样,只是将条件改为count(sid)>1
3.select sid from sc where not exist
(select sid from sc where cid='2');
第4个我还是很纠结,左链接查询不是很理解,还有那个minus集合查询操作,我还没有接触到,不知道except操作是不是有同样的效果,不过受你的启发,我写成这样不知道可以不
select sname from student left join sc on student.sid=sc.sid where exist
(select sc.sid from sc where not exist
(select sc.sid from sc where sc.cid='2'));
我自己感觉很冗杂。
ps:很感谢你的答复,呵呵。
我是从mysql入手的,请问你用的是什么DBMS呢?
Select Sid from SC t where Cid=2 and not exists (select 1 from SC where Sid=t. Sid and Cid!=2)2. 查询除了2号课程还选了其他课程的学生学号
Select Sid from SC t where Cid=2 and exists (select 1 from SC where Sid=t. Sid and Cid!=2)3. 查询选修了课程但没有选2号课程的学生学号
Select Sid from SC t where not exists (select 1 from SC where Sid=t. Sid and Cid=2)
4. 查询没有选修2号课程的学生的姓名。
Select * from Student where Sid not in (select Sid from SC where Cid=2)