我是学生
我有这样的桌子结构
student (sid, sname, gender, age, year, gpa)
dept(dname, numphds)
course(cno, cname, dname)
enroll(sid, grade, dname, cno, sectno)
我想知道结果.
Q-列印同时修读“电脑科学”课程及“数学”课程的学生姓名.
我尝试过以下查询,但它不能给我吞吐量.
select e.sid, s.sname from
enroll e ,enroll e1 ,student s ,course c
where s.sid=e.sid,
e.cno =c.cno
and e.sid=e1.sid
and c.cname='computer science' and c.name='maths';
发布于 2014-02-03 11:54:10
在SQL中引入适当的联接已经有20多年了。FFS使用它们!
试试这个:
select s.sid, s.sname
from student s
join enroll e on e.sid = s.sid
join course c on c.cno = e.cno and c.cname='computer science'
join enroll e1 on e1.sid = s.sid
join course c1 on c1.cno = e1.cno and c1.name='maths'
请注意如何将非键条件置于联接条件中。尽管如果课程名称在where
子句中,查询仍然可以工作,但是在join子句中添加条件会使它们应用的位置更加明显,从而提高可读性。
通过正确地格式化和对表进行合理的排序,您实际上可以读取查询并(希望)理解它。
发布于 2014-02-03 11:57:30
使用以下代码
select e.said, s.sname from enroll e inner join
enrool e1 on e1.sid = e.sid inner join
student s on s.sid = e.sid inner join
course c on c.cno = e.cno
where c.cname = 'computer science' and c.name = 'maths'
如果您需要使用左联接,那么请使用
select e.said, s.sname from enroll e left join
enrool e1 on e1.sid = e.sid left join
student s on s.sid = e.sid left join
course c on c.cno = e.cno
where c.cname = 'computer science' and c.name = 'maths'
https://stackoverflow.com/questions/21526412
复制相似问题