废话少说,(已经有句废话了.)
看表
语句: SELECT * FROM C
//---------------------------------------
Cno Cname Teacher
---- ---------- --------
1 语文 祁静
2 数学 张文富
3 英语 栗爱凤
(3 行受影响)
//---------------------------------------
语句: SELECT * FROM S
//---------------------------------------
Sno Sname Ssex Sage Address
-------- -------- ---- ------ --------------------
09001 张三 男 15 渭滨
09002 李四 女 15 金台
09003 王五 女 16 凤翔
09004 赵六 男 14 凤翔
09005 王麻子 女 17 陈仓
09020 张三三 男 25 宝鸡
(6 行受影响)
//---------------------------------------
语句: SELECT * FROM SC
//---------------------------------------
Sno Cno Grade
-------- ---- -----------
09001 1 2
09002 2 3
09001 2 35
09004 3 45
09005 3 45
09003 3 65
09003 1 42
09003 2 45
09006 2 55
(9 行受影响)
//---------------------------------------
//选择所有学过课程编号为'1'的学生的所有信息
用IN 做:
select S.* from S
where S.Sno in(select SC.Sno from SC where SC.Cno = '1')
//---------------------------------------
Sno Sname Ssex Sage Address
-------- -------- ---- ------ --------------------
09001 张三 男 15 渭滨
09003 王五 女 16 凤翔
//---------------------------------------
用EXISTS 做:
select S.* from S
where exists (select SC.Sno from SC where SC.Cno = '1' and SC.Sno = S.sno)
//---------------------------------------
Sno Sname Ssex Sage Address
-------- -------- ---- ------ --------------------
09001 张三 男 15 渭滨
09003 王五 女 16 凤翔
//---------------------------------------
in转换exist的方法:
select S.* from S
where S.Sno in exists (select SC.Sno from SC where SC.Cno = '1' and SC.Sno = S.sno)
1、在in(...)最后加入 and
2、and后面加入 where 与 in 中的中间部分 也就是 S.Sno
3、加入等号
4、等号后面是 in(...) 中select子句的select与from中的部分 也就是 SC.Sno
5、找到 用 in 语句中的 where字句后面的部分到 '( '结束 也就是" S.Sno in"用exists替换
完成了。
我说明白了吗,这是我自己总结的。
这是对多表连接才有用的。
大侠看一下我这个语句
//选择有和张三选学的课程一样的学生。
张三学习了课程1,2 李四学了 2, 王五学了1,2
赵六等人没有学1,2所以没有显示。
select S.* from S where S.Sno in
( select SC.Sno from SC where SC.Cno in
(select SC.Cno from SC where SC.Sno =
(select S.Sno from S where S.Sname = '张三')))
//---------------------------------------
Sno Sname Ssex Sage Address
-------- -------- ---- ------ --------------------
09001 张三 男 15 渭滨
09002 李四 女 15 金台
09003 王五 女 16 凤翔
(3 行受影响)
//---------------------------------------
用我的方法转换为
select S.* from S where exists
(select SC.Sno from SC where SC.Cno in
(select SC.Cno from SC where SC.Sno =
(select S.Sno from S where S.Sname = '张三'))and S.Sno = SC.Sno)
方便,而且结果一样。
可还是有个in怎么办呢?
研究半天觉的没有办法解决,in就是用来判断是否是某个集合中的运算而exist用来判断是否存在。
所以认为in无法消除,但书上说所有的in都可以用exists代替。
我就搞不懂了。
望高手赐教!