北京商地網(wǎng)站建設(shè)公司百度網(wǎng)站排名查詢工具
使用 EXISTS 和 NOT EXISTS 引入的子查詢可用于兩種集合原理的操作:交集與差集。
兩個(gè)集合的交集包含同時(shí)屬于兩個(gè)原集合的所有元素。差集包含只屬于兩個(gè)集合中的第一個(gè)集合的元素。
EXISTS:指定一個(gè)子查詢,檢測(cè)行的存在。
NOT EXISTS:指定一個(gè)子查詢,檢查行的不存在
exists (sql 返回結(jié)果集為真)
not exists (sql 不返回結(jié)果集為真=no rows)
?
例一:
表A??????????????????????
ID NAME
1 A1
2 A2
3 A3
?
表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3
?
表A和表B是一對(duì)多的關(guān)系 A.ID 1-->n B.AID
Select ID , NAME FROM A Where EXISTS (Select * FROM B Where A.ID = B.AID)
執(zhí)行結(jié)果為
1 A1
2 A2
原因可以按照如下分析
Select ID , NAME FROM A Where EXISTS (Select * FROM B Where B.AID = 1)
-->Select * FROM B Where B.AID = 1有值返回真所以有數(shù)據(jù)
Select ID , NAME FROM A Where EXISTS (Select * FROM B Where B.AID = 2)
-->Select * FROM B Where B.AID = 2有值返回真所以有數(shù)據(jù)
Select ID , NAME FROM A Where EXISTS (Select * FROM B Where B.AID = 3)
-->Select * FROM B Where B.AID = 3無值返回真所以沒有數(shù)據(jù)
NOT EXISTS 就是反過來
Select ID , NAME FROM A Where NOT EXIST (Select * FROM B Where A.ID = B.AID)
執(zhí)行結(jié)果為
3 A3
?
例二:
查找由位于以字母 B 開頭的城市中的任一出版商出版的書名:
?
要查找不出版商業(yè)書籍的出版商的名稱:
查找已經(jīng)不銷售的書的名稱:
?
項(xiàng)目案例:
下面是最近項(xiàng)目的經(jīng)驗(yàn)總結(jié):
如要從客戶資金表(Cfunds )中獲取每個(gè)用戶最新的一條資金情況,則在這個(gè)時(shí)候not exists 顯得尤為有用,可以省掉你去寫一大堆子查詢、Group By、In的麻煩
這個(gè)是表:
?
?
==========================================================================
IN:確定給定的值是否與子查詢或列表中的值相匹配。
IN 關(guān)鍵字使您得以選擇與列表中的任意一個(gè)值匹配的行。
當(dāng)要獲得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表時(shí),就需要下列查詢:
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1 OR CategoryID = 4 OR CategoryID = 5
然而,如果使用 IN,少鍵入一些字符也可以得到同樣的結(jié)果:
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN (1, 4, 5)
IN 關(guān)鍵字之后的項(xiàng)目必須用逗號(hào)隔開,并且括在括號(hào)中。
下列查詢?cè)?titleauthor 表中查找在任一種書中得到的版稅少于 50% 的所有作者的 au_id,然后從 authors 表中選擇 au_id 與
titleauthor 查詢結(jié)果匹配的所有作者的姓名:
SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE royaltyper < 50)
結(jié)果顯示有一些作者屬于少于 50% 的一類。
NOT IN:通過 NOT IN 關(guān)鍵字引入的子查詢也返回一列零值或更多值。
以下查詢查找沒有出版過商業(yè)書籍的出版商的名稱。
SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles WHERE type = 'business')
?
================================================================================
兩者寫法的區(qū)別:
EXISTS:后面可以是整句的查詢語句如:SELECT * FROM titles
IN:后面只能是對(duì)單列:SELECT pub_id FROM titles
================================================================================
以上是轉(zhuǎn)載的
?
個(gè)人總結(jié):
IN:
keyword in (A,B,C)?可以轉(zhuǎn)化為?keyword = A or?keyword =B or keyword =C
NOT IN:
keyword?not?in (A,B,C)?可以轉(zhuǎn)化為?keyword?<> A?and?keyword <> B?and?keyword <> C
如果其中 A,B,C 中有為NULL值的則 Keyword not in (A,B,C)?該表達(dá)式返回值為FALSE,結(jié)果就是no rows
EXISTS:
這個(gè)可以想成是父查詢的對(duì)于某個(gè)投影的結(jié)果集與子查詢對(duì)于所有投影或者部分投影的交集。這個(gè)結(jié)果集同屬于父子查詢的結(jié)果集
比如: select ename from emp e?where exists ( select? * from dept where deptno = e.deptno )
emp關(guān)系表與dept關(guān)系表是 n:1 關(guān)系--> E-R 圖轉(zhuǎn)換關(guān)系模型規(guī)則 在emp上建立dept的主鍵屬性也就是deptno,這樣兩者就可以關(guān)聯(lián)起來了
可以這么理解查詢的就是emp員工表是不是都有所屬部門了,是否還有員工沒有所屬部門
(所有員工部門號(hào)的集合)與(所有部門號(hào)的集合) 的交集, 交集關(guān)系的實(shí)現(xiàn)就是通過把員工表中員工所在部門號(hào)拿來與部門表中所有部門號(hào)比較查看是否全部都有。
emp:? empno, ename,deptno
dept:? deptno,dname
關(guān)于null: 即使子集集合返回的行是null,但它仍然是返回null了所以還是認(rèn)為存在的
exists(只要不是no rows) = true
exists(no rows) = false
感覺exists對(duì)于空的處理與in 都一樣
select * from emp where deptno in ( select deptno from dept);
select * from emp? e where exists(select * from dept where deptno = e.deptno);
以上如果
NOT EXISTS:
這個(gè)是父查詢與子查詢的差集關(guān)系
可以理解為(父查詢的部分投影的結(jié)果集)不包含(子查詢?nèi)客队敖Y(jié)果集)的結(jié)果集,這個(gè)最終結(jié)果集是屬于父查詢結(jié)果集的子集。
下面的例子就是檢索的父查詢部門的部門編號(hào)中不包含員工的結(jié)果集
舉個(gè)例子:select * from dept d where not exists( select * from emp e where e.deptno = d.deptno);
代表的意思就是 dept部門中的所有部門編號(hào)的集合減去員工表中存在相同部門編號(hào),得出剩下的集合就是,
部門中沒有員工的結(jié)合結(jié)果
not exists(n>0 rows) = false
not exists(no rows)??? = true
如果d.deptno = null 那么 整個(gè)子查詢返回的就是no rows,not exists(no rows) = true 有結(jié)果集返回
換成not in
?? select * from dept d where d.deptno not in ( select deptno from emp ) e;
?? 如果子查詢deptno有null,那么由于not in 可以轉(zhuǎn)化為 d.deptno <> e.deptno_1 and d.deptno <>e.deptno_2
?? 如果e.deptno_2是null那么這整個(gè)where 后面的結(jié)果都變?yōu)閚ull了 所以會(huì)存在沒有返回值的情況
?????????????????????????????????