1. 程式人生 > >SQL中exists,not exists的用法細節

SQL中exists,not exists的用法細節

一、存在以下兩張表:

CREATE TABLE emp_bonus1
(
EMPNO NUMBER,
RECEIVED DATE,
TYPE NUMBER,
ETPYE NUMBER
);
INSERT INTO emp_bonus1 VALUES (7369,'14-3月-2005',1,4);
INSERT INTO emp_bonus1 VALUES (7369,'14-3月-2005',1,5);

CREATE TABLE emp_bonus2
(
EMPNO NUMBER,
RECEIVED DATE,
TYPE NUMBER,
ETPYE NUMBER
);
INSERT INTO emp_bonus2 VALUES (7369,'14-3月-2005',1,5);

二、執行以下資料庫語句以及對應結果

1.SELECT * FROM emp_bonus1 eb1 
 WHERE EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE eb1.empno = eb2.empno and eb1.received = eb2.received and eb1.type = eb2.type   and eb2.etype = 4
 ); 

執行結果:無返回結果

2.SELECT * FROM emp_bonus1 eb1 
 WHERE EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE eb1.empno = eb2.empno and eb1.received = eb2.received and eb1.type = eb2.type   and eb2.etype = 5
 ); 

執行結果:

3. SELECT * FROM emp_bonus1 eb1 
 WHERE NOT EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE eb1.empno = eb2.empno and eb1.received = eb2.received and eb1.type = eb2.type  and eb2.etype = 5
 );

執行結果:無返回結果

4. SELECT * FROM emp_bonus1 eb1 
 WHERE EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE eb1.empno = eb2.empno and eb1.received = eb2.received 
            and eb1.etype = 4
 );

執行結果:

5. SELECT * FROM emp_bonus1 eb1 
 WHERE EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE eb1.empno = eb2.empno and eb1.received = eb2.received and eb1.type = eb2.type
 )
 AND eb1.etype = 4;

執行結果:

6.SELECT * FROM emp_bonus1 eb1 
 WHERE EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE eb1.empno = eb2.empno and eb1.received = eb2.received and eb1.type = eb2.type
 )
 AND eb2.etype = 5;

執行結果:

7.SELECT * FROM emp_bonus1 eb1 
 WHERE EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE  eb2.etype = 5
 ); 

執行結果:

8.SELECT * FROM emp_bonus1 eb1 
 WHERE EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE  eb2.etype = 4
 ); 

執行結果:無返回結果

9. SELECT * FROM emp_bonus1 eb1 
 WHERE NOT EXISTS(
            SELECT 1 FROM emp_bonus2 eb2 WHERE eb1.empno = eb2.empno and eb1.received = eb2.received 
            and eb1.etype = 4
 );

執行結果:

三、總結

EXISTS強調的是是否有返回集,不需知道具體返回的是什麼;

EXISTS括號內的表在不關聯外層表的情況下,一旦子查詢有資料,就查到所有的資料。

過程可理解為:將外查詢表的每一行,代入EXISTS內查詢作為檢驗,如果內查詢返回的結果取非空值,則EXISTS子句返回TRUE,這一行行可作為外查詢的結果行,否則不能作為結果。