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' ?
请高手着重从原理和方法上讲述,不胜感激. 展开
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' ?
请高手着重从原理和方法上讲述,不胜感激. 展开
3个回答
展开全部
exists子句需要有外部条件来确定数据的联系,如果不加SC_2.S#=SC.S#这句
只是exists(Select * from SC where SC.C#='002')这样的话
exists子句内部是个逻辑判断,即如果是真就返回数据,否则不返回
那么SC表中只要有002这条数据,这个子句就会始终为真,与外部没有任何关系了
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只能对应一个列
展开全部
首先要了解exists
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。
如果用Select * from SC where SC.C#='002' 那么没有关联 只要表中数据有 最后一个条件是永远存在的
所以条件就相当一个true
这样关联后 相信你知道原因了吧
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。
如果用Select * from SC where SC.C#='002' 那么没有关联 只要表中数据有 最后一个条件是永远存在的
所以条件就相当一个true
这样关联后 相信你知道原因了吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询