記一次SQL外連線and條件的誤用

2022-02-08 05:09:30 字數 1892 閱讀 9316

前段時間,在查詢專案的乙個bug時發現該問題,為此特意整理該篇,以加深自己的印象,並給相關朋友乙個注意和參考。

下面以乙個小例項來講該問題:

1、先建兩張表並插入幾條簡單的測試資料,如下圖

2、我們先看看左連線的結果(右連線類似,不再舉例)

這個結果,沒什麼好多說的,不管連線字段是否為null,table1中所有資料行全部包含。

3、我們再在左連線的基礎上,再用and接個條件看看

看到這個結果,有些朋友就會有些意外了,本人要說的這個bug正是這個and條件誤用導致。

本來期望的結果是只有第二條結果,可是卻出現了3條。

查詢了下相關資料:當把條件加入到 join子句時,sql server、informix會返回外連線表的全部行,然後使用指定的條件返回第二個表的行。也就是在原來資料行不變的情況下,and條件是對第二個表的資料行進行了篩選。

4、最後我們看看在左連線的基礎上,用where接條件的情況

o(∩_∩)o哈!這個結果正是本來所期望的結果。因為如果將條件放到where子句 中,sql server將會首先進行連線操作,然後使用where子句對連線後的行進行篩選。

補充:

上面的例子對於and的用法展示的還不是很清晰,為了讓大家更深刻的理解「

當把條件加入到 join子句時,sql server、informix會返回外連線表的全部行,然後使用指定的條件返回第二個表的行。也就是在原來資料行不變的情況下,and條件是對第二個表的資料行進行了篩選」這句話,再舉個小例子說明。

(對於樓下的一些朋友給的一些另外的方法,我非常感謝,但是我想宣告的是該篇是講外連線and的用法,標題不就這樣註明的嗎。我也不會無緣無故非要用個左連線,期望結果是舉例的一部分,是為了方便說明。)

我們在原來的表上加入新的資料,如下圖:

看看這時左連線的結果:

再看看加and的結果:

記一次sql查詢

效果圖 要查詢出如上圖的效果 知識點.1.多表巢狀查詢.2.輸出查詢結果,group concat函式 3.關聯查詢 select t1.學校,case when t1.年級 2017 then 1年級 when t1.年級 2016 then 2年級 when t1.年級 2015 then 3年...

記一次SQL優化

問題發生在關聯主表a 4w資料量 和副表b 4w資料量 關聯欄位都是openid 當時用的是 left join 直接跑sql,卡死 伺服器也是差 優化1 改left join 為join,兩者區別就是left join查詢時已主表為依據,該是幾條就幾條 就算副表沒有關聯的資料 join如果副表沒有...

記一次簡單的sql優化

統計報警點位所屬裝置的裝置報警總數top100的裝置的報警總數 需要先找出所有裝置的報警次數,按照報警次數進行排序,取前100,然後再對前100的裝置的報警次數進行統計 將報警次數top100的裝置找出來,再對整個資料進行乙個inner join,再疊加乙個count。可以計算出 select co...