in和exists的區(qū)別以及exists和distinct去重的區(qū)別?

小編相信大家都知道in和exists的區(qū)別:
1、運(yùn)用情況不同
sql中in適用于子查詢得出的結(jié)果集記錄較少,主查詢中的表較大且又有索引的表,。sql中exist適用于外層的主查詢記錄較少,子查詢中的表大,又有索引的時(shí)候。

我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、海原ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的海原網(wǎng)站制作公司

2、驅(qū)動(dòng)順序不同
IN是先查詢子查詢的表,然后將內(nèi)表和外表做一個(gè)笛卡爾積,然后按照條件進(jìn)行篩選。exists是以外層表為驅(qū)動(dòng)表,先被訪問(wèn)。

3、底層原理不同
in 是把外表和內(nèi)表作hash 連接,而exists是對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢。

但是我昨天看到有位博主講到還有一個(gè)區(qū)別就是對(duì)null值處理不同:IN不對(duì)NULL進(jìn)行處理,exists會(huì)對(duì)NULL值進(jìn)行處理。這個(gè)我沒(méi)有聽(tīng)過(guò),所以本著好奇心就去測(cè)試了一下,我發(fā)現(xiàn)沒(méi)有什么不同,查詢出來(lái)的數(shù)據(jù)也是一樣。至于其他的小編就不在這里一一測(cè)試的,有興趣的小伙伴自己私下測(cè)試一下。

先創(chuàng)建兩張表stu存放學(xué)生的編號(hào),姓名以及班級(jí)
in和exists的區(qū)別以及exists和distinct去重的區(qū)別?
grade表存放學(xué)生的編號(hào)以及分?jǐn)?shù)。
in和exists的區(qū)別以及exists和distinct去重的區(qū)別?
代碼如下:
select from stu t1 where exists (select from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;

select from stu t1 where t1.stuno in (select t2.stuno from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;
查詢結(jié)果是一樣的,如下:
in和exists的區(qū)別以及exists和distinct去重的區(qū)別?
在這里注意兩點(diǎn):
1、sql中查詢的字段均為stu表中的字段,不能寫為:
select t2.
from stu t1 where t1.stuno in (select t2.stuno from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;否則會(huì)報(bào)錯(cuò)t2.標(biāo)示符無(wú)效。
2、in是單字段查詢,所以子查詢中一定要注意!不能寫為:
select
from stu t1 where t1.stuno in (select * from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;否則會(huì)報(bào)錯(cuò)值過(guò)多。

如果哪位小伙伴有不同的見(jiàn)解,歡迎給小編留言,小編好及時(shí)糾正,謝謝!

接下來(lái)討論一下exists和distinct去重:
代碼如下,id唯一:
select from stu t1 where exists (select from grade t2 where t1.stuno = t2.stuno) order by t1.stuno;
查詢出的數(shù)據(jù)結(jié)果如下圖:
in和exists的區(qū)別以及exists和distinct去重的區(qū)別?
我當(dāng)時(shí)就一直在這里困擾,exists不是有去重的效果嗎?為什么數(shù)據(jù)里id還是有重復(fù)數(shù)據(jù)出現(xiàn),后來(lái)小編一直做實(shí)驗(yàn)測(cè)試發(fā)現(xiàn),查詢出的數(shù)據(jù)好像是先滿足子查詢中的where條件之后,然后對(duì)子查詢中的數(shù)據(jù)去重,并不是對(duì)主表去重,最后返回符合數(shù)據(jù)的主表中的數(shù)據(jù)。后來(lái)就根據(jù)這個(gè)發(fā)現(xiàn)多做了一個(gè)測(cè)試,發(fā)現(xiàn)還真是這樣。
還可以用一下sql代碼替換:
select t1.* from stu t1,(select distinct a.stuno from grade a) t2 where t1.stuno = t2.stuno order by t1.stuno;
相信大家通過(guò)這兩條代碼發(fā)現(xiàn)通過(guò)distinct不能直接實(shí)現(xiàn)exists上面查詢的效果!exists的效率會(huì)更高:
以下exists的解釋計(jì)劃窗口截圖:
in和exists的區(qū)別以及exists和distinct去重的區(qū)別?
以下distinct的解釋計(jì)劃窗口截圖:
in和exists的區(qū)別以及exists和distinct去重的區(qū)別?

所以小編今天整理一下,也希望更多網(wǎng)友不要跟我一樣再犯傻了,浪費(fèi)時(shí)間不說(shuō),還一直有一個(gè)錯(cuò)誤的理解!
大家還有什么更好的想法歡迎給小編留言!

網(wǎng)站題目:in和exists的區(qū)別以及exists和distinct去重的區(qū)別?
標(biāo)題鏈接:http://muchs.cn/article20/picsjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄Google、網(wǎng)站改版、建站公司面包屑導(dǎo)航、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化