SQL 语句中 exists和not exists的用法

exists           (返回结果集,为真)   
not exists       (不返回结果集,为真) 

表A 
ID   NAME   
1       A1 
2       A2 
3       A3 

表B 
ID   AID   NAME 
1       1       B1 
2       2       B2   
3       2       B3  

表A和表B是1对多的关系   A.ID   =>   B.AID 

 

1.SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID = B.AID);

执行结果:

ID   NAME   
1       A1 
2       A2 

原理如下:

(1)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=1) 
---> SELECT   *   FROM   B   WHERE   B.AID=1有值,返回真,所以有数据

(2)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=2) 
---> SELECT   *   FROM   B   WHERE   B.AID=2有值,返回真,所以有数据

(3)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=3) 
---> SELECT   *   FROM   B   WHERE   B.AID=3无值,返回假,所以没有数据

得到的结果为,A.ID=1或2时才有数据,所以最终的条件等于

SELECT ID,NAME FROM A where id in (1,2);

扩展:

SELECT A.ID AID,A.NAME A_NAME,B.ID BID,B.AID B_AID,B.NAME B_NAME FROM A,B WHERE A.ID = B.AID;

多表关联时,是将相关联的记录拼合到一起,而非多次拼合(而当两张表是相同的表是,会多次拼合)

 

2. 同时,我们也可以作用于多个列

在某张表中,有A->B冲突,同时B->A冲突的记录(重复记录),我们以sid<tid的记录为真实记录

create table C(
sid number,
tid number
)

insert into c values (1,2);
insert into c values (2,1);
insert into c values (2,3);
insert into c values (3,2);
insert into c values (3,4);
insert into c values (4,3);
insert into c values (5,6);

(1)找到A<->B的记录对

select distinct *  from C C1,C C2 WHERE C1.SID =C2.TID AND C1.TID = C2.SID; (切记去重)

(2)找到其中sid>tid的记录

select distinct C1.SID,C1.TID  from C C1,C C2 WHERE C1.SID =C2.TID AND C1.TID = C2.SID and C1.SID > C1.TID

(3)删除这些记录

DELETE C WHERE EXISTS (
select distinct C1.SID,C1.TID  from C C1,C C2 WHERE C1.SID =C2.TID AND C1.TID = C2.SID and C1.SID > C1.TID
AND C.SID = C1.SID AND C.TID = C1.TID
);

此时在c表中删除的就是c.sid和c.tid符合这个条件的记录了

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值