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,這一行行可作為外查詢的結果行,否則不能作為結果。