SQL 中 on 條件與 where 條件的區(qū)別

說明

最近在做 Hive 事實表 left join 多張維表時,出現(xiàn)了部分?jǐn)?shù)據(jù)丟失的情況(結(jié)果表數(shù)據(jù)量比原始事實表少 10000 多條),針對該問題研究,讓我對 SQL on 條件與 where 條件區(qū)別有可進(jìn)一步理解,特將好東西分享給大家。

Join 聯(lián)表中 on、where 后面跟條件的區(qū)別

  1. Join 生成表的過程
    數(shù)據(jù)庫在通過連接兩張或者多張表來返回記錄時,都會生成一張中間的臨時表,然后在將這張臨時表返回給用戶。這張臨時表是分析問題的重點。
  2. 在使用 left join 時,on 和 where 條件的區(qū)別
  • on 條件是在生成臨時表時使用的條件,它不管 on 中的條件是否為真,都會返回左邊表中的記錄。
  • where 條件是在臨時表生成好后,再對臨時表進(jìn)行過濾的條件。這時已經(jīng)沒有了 left join的含義了,where 條件不為真的數(shù)據(jù)將會全部過濾掉。

示例說明

  1. 假設(shè)有兩張表
    表 1:


    tab1

    表 2:


    tab2
  2. 執(zhí)行如下SQL
-- SQL 1
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
-- SQL 2
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
  1. 輸出結(jié)果


    SQL 1

    SQL 2
  2. 總結(jié)
    其實以上結(jié)果的關(guān)鍵原因就是 left join、right join、full join 的特殊性,不管 on 上的條件是否為真都會返回 left 或者 right 表中的記錄,full 則具有 left 和 right 特性的并集。而 inner join 沒有這個特性,則條件放在 on 和 where 中,返回的結(jié)果集是相同的。

原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容