什么时候用exists 什么时候用in???

in
not in
exists
not exists

1,什么时候用exists 什么时候用in???

使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行 子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起
,待子查询执行完毕,存放在临时表中以后再执行主查询。 这也就是使用EXISTS比使用IN通常查询速度快的原因。

1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量小而T2数据量非常大时,T1    exits 效率高
T1数据量非常大而T2数据量小时,T1>>T2 时,2) in 的查询效率高。

1)Select name from employee where name not in (select name from student);
2)Select name from employee where not exists (select name from student);

2,做项目的时候发现会报 无效数字的错误

百思不得其解
后来发现sql报错 不一定是 sql的错 有时候数据也有原因

代码例子

eg:

create table A1
(
ID  varchar2(10),
NAME VARCHAR2(10)
);
create table A
(
ID  NUMBER,
NAME VARCHAR2(10)
);

CREATE   TABLE B1
(
ID NUMBER ,
AID VARCHAR2(10),
NAME VARCHAR2(10)
);
CREATE TABLE B
(
ID NUMBER,
AID NUMBER,
NAME VARCHAR2(10)
);
INSERT INTO A1 VALUES(1,'A1');
INSERT INTO A1 VALUES(2,'A2');
INSERT INTO A1 VALUES('a','A3');

INSERT INTO A VALUES(1,'A1');
INSERT INTO A VALUES(2,'A2');
INSERT INTO A VALUES(3,'A3');

INSERT INTO B VALUES(1,1,'B1');
INSERT INTO B VALUES(2,2,'B2');
INSERT INTO B VALUES(3,2,'B3');

INSERT INTO B1 VALUES(1,1,'B1');
INSERT INTO B1 VALUES(2,2,'B2');
INSERT INTO B1 VALUES('3','a','B3');

select * from a1;
--相当于员工表
SELECT * FROM A;
SELECT * FROM B;
---相当于客户经理
SELECT * FROM B1;

select * from A  LEFT JOIN B1 ON A.ID=B1.AID ;

SELECT * FROM B1 WHERE   EXISTS(SELECT A.id FROM A WHERE A.ID=B1.AID);

select * from B1 WHERE B1.AID   IN (SELECT A.ID FROM A);




not exists 深入用法

问题 详细描述 当exists 里面的表 有多个条件的话

drop table ck;
drop table ck2;
create table ck
(
id number(10),
id2 number(10),
name varchar2(20)
);



create table ck2
(
id number(10),
id2 number(10),
sex varchar2(20)
);

insert into ck values(1,1,'张三');
insert into ck values(2,2,'李四');
insert into ck values(3,3,'王五');
insert into ck values(4,3,'周六');
insert into ck values(5,4,'77');
insert into ck values(6,5,'张三');

insert into ck2 values(1,1,'0000000000000000');
insert into ck2 values(2,1,'0000000000000000');
insert into ck2 values(2,2,'0000000000000000');
insert into ck2 values(7,3,'0000000000000000');

select * from ck2 where   not exists
(
select * from ck where ck2.id=ck.id  and ck.id2=ck2.id2  and ck.name<>'00' 
);

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值