SQL IN 转化为 EXISTS 的方法

废话少说,(已经有句废话了.)

看表

 

 语句: 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代替。

我就搞不懂了。

望高手赐教!

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值