in和exists
創(chuàng)新互聯(lián)建站總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)站維護(hù)、公眾號(hào)搭建、小程序制作、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動(dòng)行銷領(lǐng)域創(chuàng)造價(jià)值而不懈努力!
in 是把外表和內(nèi)表作hash 連接,而exists是對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢。
如果兩個(gè)表中一個(gè)較小,一個(gè)是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查詢語句使用了not in 那么內(nèi)外表都進(jìn)行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個(gè)表大,用not exists都比not in要快。
in 與 =的區(qū)別
select name from student where name in ('zhang','wang','li','zhao');與
select name from student where name='zhang' or name='li' or
name='wang' or name='zhao'
的結(jié)果是相同的。
派生表:比如要查找一個(gè)叫張鐵牛的人的信息,我們知道他是男性,為了縮小查找范圍我把所有的男性都找出來,然后從這些男性中里面再去找張鐵牛。這里男性的集合就相當(dāng)于派生表,轉(zhuǎn)成sql語句是這樣select 姓名,住址,身份證 from (select * from 表名 where 性別='男性') t where 姓名='張鐵牛'(這里只是為了舉例子),這里的t這個(gè)數(shù)據(jù)集就是派生表,它是虛表,在數(shù)據(jù)庫中不存在的,是我們構(gòu)建的,在這里的目的是為了縮小數(shù)據(jù)的查找范圍。
相關(guān)子查詢:子查詢的執(zhí)行依賴于外部查詢的數(shù)據(jù),外部查詢執(zhí)行一行,子查詢就執(zhí)行一次。比如:select * from 外表 where 姓名 in (select 姓名 from 內(nèi)表 where 外表.姓名=內(nèi)表.姓名),你看在括號(hào)里的sql語句,是與外表關(guān)聯(lián)的。這里順便說一下非相關(guān)子查詢,還是以上面為例,如:select * from 外表 where 姓名 in (select 姓名 from 內(nèi)表 where 外表.姓名='張鐵牛'),你看這個(gè)語句中括號(hào)里的sql語句,它是單獨(dú)執(zhí)行的,與外表沒有任何關(guān)聯(lián),它只執(zhí)行一次,執(zhí)行完后將結(jié)果集傳遞給外部查詢使用。
這里只是表面上描述了一下,內(nèi)部還有其他區(qū)別,lz需要通過聯(lián)系體會(huì),有問題再追問,望采納。
1 建立主鍵是為了給外表引用,主鍵必須非空、唯一,主鍵排好了序優(yōu)化了查詢速度;組合列做主鍵時(shí),只要某幾個(gè)列組合起來可以唯一標(biāo)識(shí)一行,那這幾個(gè)列就足夠做主鍵了。一個(gè)表只能有一個(gè)主鍵。組合多個(gè)列的主鍵效率極差,擴(kuò)展性也差,一般需要二個(gè)以上才能做主鍵時(shí),還不如加一個(gè)自增長標(biāo)識(shí)列做主鍵。
2 主鍵就是唯一的。其它的根據(jù)實(shí)際情況設(shè),例如學(xué)生表的學(xué)號(hào)是唯一的,可以做主鍵。學(xué)生的身份證號(hào)也是唯一的。
3 在不想用組合主鍵的時(shí)候,用標(biāo)識(shí)列。一個(gè)表只能有一個(gè)標(biāo)識(shí)列。
4 性別列: default('男')
5 性別列; check (性別='男' or 性別='女')
6 分?jǐn)?shù)表引用了學(xué)生表的學(xué)號(hào),就要設(shè)置外鍵。外鍵強(qiáng)制引用的完整性??赡芗?jí)聯(lián)更新和刪除。
sqlserver嵌套查詢語句中使用in或者exists的場景和原則如下:
如果查詢的兩個(gè)表大小相當(dāng),那么用in和exists差別不大。兩者都可以使用。
in 是把外表和內(nèi)表作hash 連接,而exists是對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢。所以當(dāng)有多重循環(huán),使用in更合適,效率越高。
如果兩個(gè)表中一個(gè)較小,一個(gè)是大表,則子查詢表大的用exists,子查詢表小的用in。
NOT EXISTS,exists的用法跟in不一樣,一般都需要和子表進(jìn)行關(guān)聯(lián),而且關(guān)聯(lián)時(shí),需要用索引,這樣就可以加快速度。
alter table table2
add constraint foreign_key_name foreign key (column)
references table1主表 (column)
--on delete cascade 刪除時(shí)是否級(jí)聯(lián)刪除