exists()和in()的应用

1.应用

 

例:

  emp表:

AddressNumber
bj40
bj30
fj20
fj10

 

  dept表:

BearingAdds
NObj
SO

fj

 

(1) exists()的应用

 select sum(Number) from emp
 where exists(
         select * from dept  where Bearing = 'SO'
       )

 

输出的结果是: 100

 

    结果好像不符合。但答案是正确的,因为:exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真 ,否则返回假。not exists则相反。

 

    exists做为where 条件时,是先对where 前的主查询进行查询,然后用主查询的结果代入exists的查询进行判断 ,如果为真则输出当前主查询的结果 ,否则不输出。

 

    not exists以exists相反。

 

(2) in的应用

select sum(Number) from emp
where Address in(
     select Adds from dept where Bearing = 'SO'
)
 

输出的结果是: 30

 

  in是用来判断某个字段包含的值。允许在where字句中有多个值。

  not in 是不包含的值。

 

语法:

select * from 表1 where 字段1 in (val,val,.....)

 

 

select * from emp
where adds not in(
   select Adds from dept where Bearing = 'SO'
);

select * from emp
where not exists(
    select Adds from dept
     where Bearing ='SO' and emp.Address = dept.Adds
)

 

2.效率

  in和exists的效率值不是绝对的。

 

   in适合于外表大内表小的          

 select * from emp where deptid in (select id from dept)
转化为:
  select * from emp ,(select distinct id from dept) dept
   where emp .deptid = dept.id;
 

 

  exists适合于外表小内表大的

select * from emp where exists(select id from dept where dept.id = emp.deptid )
转化为:
  for deptid in (select * from emp )
  loop
    if (exists(select id from dept where  id = emp.deptid )
    then
      OUTPUT THE RECORD!
    end if
  end loop
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值