1. 程式人生 > >left join on 和where條件的放置

left join on 和where條件的放置

JOIN聯表中ON,WHERE後面跟條件的區別

對於JOIN的連表操作,這裡就不細述了,當我們在對錶進行JOIN關聯操作時,對於ON和WHERE後面的條件,不清楚大家有沒有注意過,有什麼區別,可能有的朋友會認為跟在它們後面的條件是一樣的,你可以跟在ON後面,如果願意,也可以跟在WHERE後面。它們在ON和WHERE後面究竟有一個什麼樣的區別呢?

在JOIN操作裡,有幾種情況。LEFT JOIN,RIGHT JOIN,INNER JOIN等。

為了清楚的表達主題所描述的問題,我簡要的對LEFT,RIGHT,INNER這幾種連線方式作一個說明。

下面就拿一個普通的部落格系統的日誌表(post)和分類表(category)來描述吧。

這裡我們規定有的日誌可能沒有分類,有的分類可能目前沒有屬於它的文章。

1.    LEFT JOIN:

(保證找出左聯表中的所有行)

查出所有文章,並顯示出他們的分類:

複製程式碼
SELECT p.title,c.category_name FROM post p LEFT JOIN category c ON p.cid = c.cid

2.    RIGHT JOIN:

(保證找出右聯表中的所有行)

查詢所有的分類,並顯示出該分類所含有的文章數。

複製程式碼
SELECT COUNT(p.id),c.category_name FROM post p RIGHTJOIN  category c ON
p.pid = c.cid

3.    INNER JOIN

(找出兩表中關聯相等的行)

查詢有所屬分類的日誌。(即那些沒有所性分類的日誌文章將不要我們的查詢範圍之內)。

複製程式碼
SELECT p.title,c.category_name FROM post p INNER JOIN category c ON p.cid = c.cid.

這種情況和直接兩表硬關聯等價。

現在我們回過頭來看上面的問題。

對於第一種情況,如果我們所ON 的條件寫在WHERE 後面,將會出現什麼情況呢?

即:

複製程式碼
SELECT p.title,c.category_name FROM post p LEFT
JOIN category c WHERE p.cid = c.cid

對於第二種情況,我們同樣按照上面的書寫方式。

複製程式碼
SELECT COUNT(p.id),c.category_name FROM post p RIGHTJOIN  category c WHERE p.pid = c.cid

如果執行上面的SQL語句,就會發現,它們已經過濾掉了一些不滿足條件的記錄,可能在這裡,大家會產生疑問了,不是用了LEFT和RIGHT嗎?它們可以保證左邊或者右邊的所有行被全部查詢出來,為什麼現在不管用了呢?對於出現這種的問題,呵呵!是不是覺得有些不可思議。

出現這種的問題,原因就在WHERE和ON這兩個關鍵字後面跟條件。

好了,現在我也不調大家味口了,給大家提示答案吧。

對於JOIN參與的表的關聯操作,如果需要不滿足連線條件的行也在我們的查詢範圍內的話,我們就必需把連線條件放在ON後面,而不能放在WHERE後面,如果我們把連線條件放在了WHERE後面,那麼所有的LEFT,RIGHT,等這些操作將不起任何作用,對於這種情況,它的效果就完全等同於INNER連線。對於那些不影響選擇行的條件,放在ON或者WHERE後面就可以。

記住:所有的連線條件都必需要放在ON後面,不然前面的所有LEFT,和RIGHT關聯將作為擺設,而不起任何作用。

這個問題是前幾天在我們phpoo討論區裡提的問題,一直沒有寫出比較詳細的區別,其實這個問題完全可以用一句話描述清楚,那麼,為什麼我要在這裡寫上這麼多囉嗦的話,主要是因為在對自己的知識進行鞏固的同時,我也希望能給更多的朋友帶來方便,而且現在我們的phpoo團隊裡各成員的水平參差不齊,所以為了照顧更多的人,才多囉嗦了這麼幾句,希望團裡面的高手們不了笑話。

相關推薦

left join on where條件放置

JOIN聯表中ON,WHERE後面跟條件的區別 對於JOIN的連表操作,這裡就不細述了,當我們在對錶進行JOIN關聯操作時,對於ON和WHERE後面的條件,不清楚大家有沒有注意過,有什麼區別,可能有的朋友會認為跟在它們後面的條件是一樣的,你可以跟在ON後面,如果願意,也可以跟在WHERE後面。它們在ON和W

left join onwhere

tab sid image 宋體 body 基礎上 連接 成績 生成 left join on: 向左關聯某個表記錄,意思是以左邊的表記錄為基準,通過關聯條件會從左表返回所有的行,即使在右表中沒有匹配的行。 舉個例子: select * from A left join B

親測SQL left join on where 效率

最近看到很多前輩都用了left join on,於是在網上查了好久,感覺說的不大對勁,於是,親測了一下。雖然不嚴謹,但是,已經反映一般規律了。 親測SQL  left join on 和 where 效率 紀念一下自己測試的結果: where 用了1點多秒 下面是lef

left join onwhere區別

left join中關於where和on條件的幾個知識點:     1.多表left join是會生成一張臨時

left join on後面 加條件where後面加條件的區別 inner joinleft join right join之間的區別

上一篇對三個join的語句做了一個區別,如果連最基礎的都不清楚,那麼請先參考:inner join 與 left join 和right join之間的區別 碰巧在專案中遇到了一個sql,是left join和where的條件限制的區別,想了好半天,這裡做一下筆記,萬一以後忘記了方便檢視。 話不多說,直接

left join on 後增加條件分析

SQL用過一定時間的同學,對left join,right join應該非常熟悉了,可能有些同學包括我在內, 對left/right join on 後面增加左表或右表條件後,或者多個left/right join 表不同的位置查詢結果 感覺到很不解,因此我對以下左連線做了分析演示:

join on where的執行順序

轉自:https://www.cnblogs.com/Jessy/p/3525419.html left join :左連線,返回左表中所有的記錄以及右表中連線欄位相等的記錄。 right join :右連線,返回右表中所有的記錄以及左表中連線欄位相等的記錄。 inner join: 內連線

SQL語句:left join後面加上where條件

select a.*,b.* from table1 a left join table2 b on b.X=a.X where XXX 如上SQL:一旦使用了left join,沒有where條件時,左表table1會顯示全部內容     而使用了where,只有滿足where條

sql中left join on 多個條件需要特殊注意之處

定義: LEFT JOIN 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。例如如下查詢: SELECT column_name(s) FROM table_name1 LEFT JOIN table_

join onwhere執行順序認識T-SQL查詢處理執行順序

SQL語句中join連表時on和where後都可以跟條件,那麼對查詢結果集,執行順序,效率是如何呢? 通過查詢資料發現:區別:on是對中間結果進行篩選,where是對最終結果篩選。執行順序:先進行on的過濾, 而後才進行join。效率:如果是inner join, 放o

Mysql 中Left/Right join on後面andwhere條件查詢的差異-Mysql SQL運算子是有優先順序

一、Mysql中Left/Right join on後面and和where條件查詢的差異 1、建兩張測試表,一張商戶定義表、一張商戶操作狀態明細表 1)商戶定義表 CREATE TABLE hope.merchant (  MERCHANT_id varchar(100) COLLATE ut

mysql left join on條件where條件的位置作用及關係

on是在生成臨時表的時候使用的條件,不管on的條件是否起到作用,都會返回左表的行, where則是在生成臨時表之後使用的條件,此時已經不管是否使用了left join了,只要條件不為真的行,全部過濾掉。 --所以要寫在on條件之後

left join on +多條件where區別

sql sel null pri opera 不存在 || per int left join on +多條件與where區別 重點 先匹配,再篩選where條件。 本文將通過幾個例子說明兩者的差別。 1. 單個條件 select * from product a l

關於sql裡面的join on 後面的條件where後面的條件的區別。。。。

面試過程中被問到了。。。。 先來轉載一篇說的簡單清晰的部落格。。 https://blog.csdn.net/muxiaoshan/article/details/7617533  資料庫中join on 後面的條件和where後面的條件的區別:   資料庫在通過

left join on and left join on where的區別

left join on and 和 left join on where的區別   一、left join on   on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 二、left join on and &nbs

SQL語句Left joinOnWhere的用法區別

如果SQL用的是Left Join ,On後面的條件對Left的表沒有作用,只對Right的表有過濾作用,Where語句可以對Left的表有過濾作用 如果SQL用的是Right Join ,On後面的條件對Right的表沒有作用,只對Left的表有過濾作用,Where

Oracle的left joinonwhere的區別以及與(+)的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。       在使用left jion時,on和where條件的區別如下: 1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 2、where條件是在臨時表生成好後

Oracle的left joinonwhere的區別

資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。     在使用left jion時,on和where條件的區別如下:     1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記

jpa/hibernate @onetomany 使用left join 添加多條件,可以使用過濾器filters (with-clause not allowed on fetched associations; use filters異常信息)

modified tran SQ fetch join vat reac sset nag package com.ipinyou.mip.dataAsset.campaignManagement.entity; import com.ipinyou.mip.util

MySQL - ON & WHERE 條件區別執行順序

一、案例 資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。 在使用left jion時,on和where條件的區別如下: 1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。 2、