oracle关键字exists的使用研究(只研究用法)

 

以下实验是本人实际查询结果,结论也是本人自己总结的,结论可能有不对的地方,仅供参考!

/*
 首先我们建立3张表lsy_a,lsy_b,lsy_other
 其中lsy_a和lsy_b有外键aid关联。lsy_other无关联。
 这3张表都有name这一列,并且每张表的name列都有相同的
 值和不同的值。
 特别要注意lsy_b这张表,它里面有引用lsy_a列的相同的name值分两种情况:
 1,外键,name和lsy_a一致
 2,外键,name和lsy_a不一致
*/

 

看看表里的数据吧:

 

lsy_a

IDNAMEADDRESS
16samename1samename1address
17samename2samename2address
18samename3samename3address
11a_name_11a11_address
12a_name_12a12_address
13a_name_13a13_address
14a_name_14a14_address
15a_name_15a15_address

 

lsy_b

IDAIDNAMEEMAIL
2111b_name_21b21email
2212b_name_22b22email
2312b_name_23b23email
2411b_name_24b24email
2512b_name_25b25email
2616samename1samename26email
2717samename2samename27email
2811samename1samename28email
2912samename2samename29email

 

lsy_other

IDNAMEPHONE
31other_name_31other31phone
32other_name_32other32phone
33other_name_33other33phone
34other_name_34other34phone
35samename1othersamename35phone
36samename2othersamename36phone

 

 

看看各种情况下的查询结果,这几个很好理解结果就不贴了:

--1
select * from lsy_a a 
where exists (
  select * from lsy_b b--结果是lsy_a中所有值
)
--1-2
select * from  lsy_b b
where exists (
  select * from lsy_a a--结果是lsy_b中所有值
)
--2
select a.address from lsy_a a 
where exists (
  select * from lsy_b b --结果是lsy_a中所有address这列的值(注意lsy_b无此列)
)
--2-2
select b.email from lsy_b b
where exists (
  select * from  lsy_a a --结果是lsy_b中所有email这列的值(注意lsy_a无此列)
)
--3
select a.* from lsy_a a 
where exists (
  select * from lsy_b b 
  where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/*结果lsy_a中有关联的数据被查询出*/

--3-2
select b.* from lsy_b b
where exists (
  select * from  lsy_a a 
  where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/*结果lsy_b中所有的数据被查询出,因为lsy_b有外键所以肯定所有数据都有关联*/

--4,下面再在3的基础上改变,看看结果是什么样
select a.address from lsy_a a 
where exists (
  select * from lsy_b b 
  where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)

/*  结果lsy_a中有关联的数据的address列查询出来了,从结果集可以看出
    lsy_a和lsy_b是通过外键aid列关联的!
 */
--4-2
select b.email from  lsy_b b 
where exists (
  select * from lsy_a a
  where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/*  结果lsy_b中有关联的数据的email列查询出来了,而lsy_a中根本没有email这一列!
   这有点不好理解,我们翻译一下这个sql成中文就是从b中查询数据,条件b的数据在a中出现。
   那a的列和b的列不对应,那怎样判定条件b的数据在a中出现是否成立呢?我再建一张表lsy_other
   ,其中也有id,name但它是张独立的表,没有外间,和前两张表没关系,只是有两列的名字起得相同而已。
   我们继续研究。
 */

--5
select * from lsy_a a 
where exists (
  select * from lsy_other o--结果是lsy_a中所有值
)
--5-2
select * from lsy_other o
where exists (
  select * from lsy_a a --结果是lsy_other中所有值
)

--6
select * from lsy_a a 
where exists (
  select * from lsy_other o 
  where a.name=o.name --通过name列关联,结果是有相同name的值被查出
)
--6-2
select * from  lsy_other o 
where exists (
  select * from lsy_a a 
  where a.name=o.name  --通过name列关联,结果是有相同name的值被查出
)


下面看几个关键的:

--7
select a.address from lsy_a a 
where exists (
  select * from lsy_other o 
  where a.name=o.name  --通过name列关联,结果是有相同name的address列的值被查出
)


结果集:

ADDRESS
samename1address
samename2address

 

 

--7-2
select * from lsy_a a 
where exists (
  select o.phone from lsy_other o  --注意:子查询只有phone这列
  where a.name=o.name  --通过name列关联,结果是有相同name的值被查出
)

结果集:

IDNAMEADDRESS
16samename1samename1address
17samename2samename2address

 

--7-3
select a.address from lsy_a a 
where exists (
  select o.phone from lsy_other o  --注意:子查询只有phone这列
  where a.name=o.name  --通过name列关联,结果是有相同name的address列的值被查出
)

结果集:

ADDRESS
samename1address
samename2address

 

/*
   从结果集我得出以下结论:
   看这样一个形式,
  select 表A的列 from 表A a 
where exists (
  select 表B的列 from 表B b  
  where 表A和表B关联的条件(不一定是外键)
)

1:select 表A的列是最终在结果集你要的列,改查什么就查什么,没什么好说的。
2:在exists中“select 表B的列 from 表B b”根本没什么用!你完全可以随便写一个或多个表B的列,
 它在where条件中没用到照样能查数据,所以这句你可以随便写,一般写成*就行(如7-3)
3:在exists中where条件才是决定这两张表是如何关联的,这个你要小心的写。
4:如果不写where条件,那exists就没有任何意义,它默认查出所有的值!你干脆把exists去掉算了。
总之:exists查询我们可以这样翻译更好理解:
从表A查询表A的某些列作为结果集 ,表A中的每一行数据需要符合这样一个条件:
表A的行和表B的行符合条件 {where 表A和表B关联的条件(不一定是外键)}。
*/


 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值