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'
);