exists()和in()的应用

1.应用

例:

  emp表:

Address Number
bj 40
bj 30
fj 20
fj 10

  dept表:

Bearing Adds
NO bj
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
 

猜你喜欢

转载自xuan155.iteye.com/blog/1687269