SQL查询语句问题求解?

Student(S#,Sname,Sage,Ssex)学生表Course(C#,Cname,T#)课程表SC(S#,C#,score)成绩表Teacher(T#,Tnam... Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表

---------查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001' and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');

问题: exists 后,为什么这个子查询还要自连接查询一下,过滤出c#=‘002’的情况,为何不能够直接 Select * from SC where SC.C#='002' ?
请高手着重从原理和方法上讲述,不胜感激.
展开
 我来答
szm341
2013-01-05 · TA获得超过6726个赞
知道大有可为答主
回答量:5005
采纳率:100%
帮助的人:5146万
展开全部
exists子句需要有外部条件来确定数据的联系,如果不加SC_2.S#=SC.S#这句
只是exists(Select * from SC where SC.C#='002')这样的话
exists子句内部是个逻辑判断,即如果是真就返回数据,否则不返回
那么SC表中只要有002这条数据,这个子句就会始终为真,与外部没有任何关系了
SC_2.S#=SC.S#这个条件是确定外部已经查询得到的结果,继续纵向筛选数据
追问
那如果换成“in”,是不是就可以用 Select * from SC where  SC.C#='002' 了?
追答
恩,是的。如果换成in可以改成
and SC.S# in (Select S# from SC where C#='002')
in只能对应一个列
酒意何存
2013-01-16 · 超过51用户采纳过TA的回答
知道答主
回答量:123
采纳率:100%
帮助的人:79.9万
展开全部
首先要了解exists
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。
如果用Select * from SC where SC.C#='002' 那么没有关联 只要表中数据有 最后一个条件是永远存在的
所以条件就相当一个true
这样关联后 相信你知道原因了吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
侯进录
2013-01-11
知道答主
回答量:21
采纳率:0%
帮助的人:13.6万
展开全部
把四个表样发上??
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式