mysql left join on_mysql,left join on
覺(jué)得很有幫助,用來(lái)學(xué)習(xí)。
即使你認(rèn)為自己已對(duì) MySQL 的 LEFT JOIN 理解深刻,但我敢打賭,這篇文章肯定能讓你學(xué)會(huì)點(diǎn)東西!
ON 子句與 WHERE 子句的不同
一種更好地理解帶有 WHERE ... IS NULL 子句的復(fù)雜匹配條件的簡(jiǎn)單方法
Matching-Conditions 與 Where-conditions 的不同
關(guān)于 “A LEFT JOIN B ON 條件表達(dá)式” 的一點(diǎn)提醒
ON條件(“A LEFT JOIN B ON 條件表達(dá)式”中的ON)用來(lái)決定如何從 B 表中檢索數(shù)據(jù)行。
如果 B 表中沒(méi)有任何一行數(shù)據(jù)匹配 ON 的條件,將會(huì)額外生成一行所有列為 NULL 的數(shù)據(jù)
在匹配階段 WHERE 子句的條件都不會(huì)被使用。僅在匹配階段完成以后,WHERE 子句條件才會(huì)被使用。它將從匹配階段產(chǎn)生的數(shù)據(jù)中檢索過(guò)濾。
讓我們看一個(gè) LFET JOIN 示例:
ON 子句和 WHERE 子句有什么不同?
一個(gè)問(wèn)題:下面兩個(gè)查詢的結(jié)果集有什么不同么?
用例子來(lái)理解最好不過(guò)了:
第一條查詢使用 ON 條件決定了從 LEFT JOIN的 product_details表中檢索符合的所有數(shù)據(jù)行。
第二條查詢做了簡(jiǎn)單的LEFT JOIN,然后使用 WHERE 子句從 LEFT JOIN的數(shù)據(jù)中過(guò)濾掉不符合條件的數(shù)據(jù)行。
再來(lái)看一些示例:
所有來(lái)自product表的數(shù)據(jù)行都被檢索到了,但沒(méi)有在product_details表中匹配到記錄(product.id = product_details.id AND product.amount=100 條件并沒(méi)有匹配到任何數(shù)據(jù))
同樣,所有來(lái)自product表的數(shù)據(jù)行都被檢索到了,有一條數(shù)據(jù)匹配到了。
使用WHERE ... IS NULL 子句的 LEFT JOIN
當(dāng)你使用 WHERE ... IS NULL 子句時(shí)會(huì)發(fā)生什么呢?
如前所述,WHERE 條件查詢發(fā)生在 匹配階段之后,這意味著 WHERE ... IS NULL 子句將從匹配階段后的數(shù)據(jù)中過(guò)濾掉不滿足匹配條件的數(shù)據(jù)行。
紙面上看起來(lái)很清楚,但是當(dāng)你在ON 子句中使用多個(gè)條件時(shí)就會(huì)感到困惑了。
我總結(jié)了一種簡(jiǎn)單的方式來(lái)理解上述情況:
將 IS NULL 作為否定匹配條件
使用 !(A and B) == !A OR !B邏輯判斷
看看下面的示例:
讓我們檢查一下 ON 匹配子句:
我們可以把 IS NULL 子句 看作是否定匹配條件。
這意味著我們將檢索到以下行:
就像在C語(yǔ)言中的邏輯 AND 和 邏輯 OR表達(dá)式一樣,其操作數(shù)是從左到右求值的。如果第一個(gè)參數(shù)做夠判斷操作結(jié)果,那么第二個(gè)參數(shù)便不會(huì)被計(jì)算求值(短路效果)
看看別的示例:
Matching-Conditions 與 Where-conditions 之戰(zhàn)
如果你吧基本的查詢條件放在 ON子句中,把剩下的否定條件放在 WHERE子句中,那么你會(huì)獲得相同的結(jié)果。
例如,你可以不這樣寫(xiě):
你可以這樣寫(xiě):
你可以不這樣寫(xiě):
可以這樣寫(xiě):
這些查詢真的效果一樣?
如果你只需要第一個(gè)表中的數(shù)據(jù)的話,這些查詢會(huì)返回相同的結(jié)果集。有一種情況就是,如果你從 LEFT JOIN的表中檢索數(shù)據(jù)時(shí),查詢的結(jié)果就不同了。
如前所屬,WHERE 子句是在匹配階段之后用來(lái)過(guò)濾的。
例如:
總附注:
如果你使用 LEFT JOIN 來(lái)尋找在一些表中不存在的記錄,你需要做下面的測(cè)試:WHERE 部分的 col_name IS NULL(其中 col_name 列被定義為 NOT NULL),MYSQL 在查詢到一條匹配LEFT JOIN 條件后將停止搜索更多行(在一個(gè)特定的組合鍵下)。
oracle join 和 where 的區(qū)別
http://blog.csdn.net/li2008xue2008ling/article/details/8456619
總結(jié)
以上是生活随笔為你收集整理的mysql left join on_mysql,left join on的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 广播变量kyro_Spark简介
- 下一篇: mysql中的逻辑类型如何定义_MYSQ