鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)/ sql總exists是通過(guò)什么來(lái)評(píng)判存在與否

sql總exists是通過(guò)什么來(lái)評(píng)判存在與否

sql:
select * from employees s where not exists
(select 1 from dept_emp d where d.emp_no=s.emp_no)

內(nèi)表s:
外表d:
網(wǎng)上對(duì)exists的解釋:exists是對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢
我的疑問(wèn):
外表是通過(guò)其中一個(gè)字段去loop內(nèi)表,只要有一個(gè)字段存在,就是存在?
還是
外表是通過(guò)整條數(shù)據(jù)去跟內(nèi)表匹配,是否存在,如果是這樣,是不是不應(yīng)是select 1
總之,沒(méi)想明白,exists到底是用什么來(lái)判斷是否存在的,一行記錄,一行記錄的一個(gè)字段,還是其他?

回答
編輯回答
神經(jīng)質(zhì)

exists

指定一個(gè)子查詢,檢測(cè)行的存在。遍歷循環(huán)外表,然后看外表中的記錄有沒(méi)有和內(nèi)表的數(shù)據(jù)一樣的。匹配上就將結(jié)果放入結(jié)果集中。具體sql語(yǔ)句如下:

SELECT
    `user`.*
FROM
    `user`
WHERE
    EXISTS (
        SELECT
            `order`.user_id
        FROM
            `order`
        WHERE
            `user`.id = `order`.user_id
    )

使用exists關(guān)鍵字進(jìn)行查詢的時(shí)候,首先,我們先查詢的不是子查詢的內(nèi)容,而是查我們的主查詢的表,也就是說(shuō),我們先執(zhí)行的sql語(yǔ)句是:

SELECT `user`.* FROM `user` 

然后,根據(jù)表的每一條記錄,執(zhí)行以下語(yǔ)句,依次去判斷where后面的條件是否成立:

EXISTS (
        SELECT
            `order`.user_id
        FROM
            `order`
        WHERE
            `user`.id = `order`.user_id
    )

如果成立則返回true不成立則返回false。如果返回的是true的話,則該行結(jié)果保留,如果返回的是false的話,則刪除該行,最后將得到的結(jié)果返回。也可以和IN對(duì)比來(lái)分辯認(rèn)識(shí)它們
Sql語(yǔ)句中IN和exists的區(qū)別及應(yīng)用

2017年4月4日 02:26
編輯回答
好難瘦

where語(yǔ)句中有匹配條件,d.emp_no=s.emp_no

如果能找到符合條件的記錄就表示exists成立,和select中選擇的內(nèi)容沒(méi)關(guān)系,只是慣例寫數(shù)字1,換成表的id字段或其他常量值都可以。

2017年7月7日 06:56