也許你看到這篇文章覺得很基礎,別忙着吐糟,仔細想想,說不定你也會載在這個上面。關於left join 你到底了解多少?無論你是資深的老鳥還是剛入行的菜鳥,都會有所收獲。也許某天你去面試的時候會突然碰到這樣的一道題,心里會有所失望,竟然考這么簡單的題!ON , 你錯了,仔細想想會發現,結果會是這樣的嗎?
先來看看你對left join 了解多少把:這里定義了兩張表,數據如下:
declare @order table(ID int,Name varchar(20)) declare @Detail table(ID int,Price float) insert into @order(ID,Name) values(1,'aa'),(2,'bb'),(3,'cc') insert into @Detail(ID,Price) values(1,10.5),(2,12.3),(4,5.9) select * from @order select * from @Detail
如果運行一下:left join 的聯合查詢
select * from @order o left join @Detail d on o.ID=d.ID
都別急着看運行結果,猜猜看結果會是怎樣的呢?
結果是會顯示出四列:ID Name ID Price 而如果要顯示三列就不能用 * 而需要明確的指定列名。
如果這個答案你是正確的,那么我們來看看下面的條件又會出現什么結果呢?
select * from @order o left join @Detail d on 1=1
這個猜測看,我覺得會難道一大批人。這個是我們最熟悉而又最容易摔到的地方,這個語句運行后結果會是記錄呢?看看結果吧!
結果出來的時候我們才會恍然大悟。
別急,精彩繼續,或許有一天你會被問到 left join 與 left outer join 有什么區別,到底會有什么區別呢?我們來分別執行下下面的語句:
select * from @order o left join @Detail d on o.ID=d.ID select * from @order o left outer join @Detail d on o.ID=d.ID select * from @order o left join @Detail d on 1=1 select * from @order o left outer join @Detail d on 1=1
結果如下:
他們的結果並未區別,這時才恍然大悟,原來只是被面試官給坑了。Left join 只不過是left outer join 的縮寫而已,我們習慣了left join時就不會去管left outer join,當某天被突然提及時又有所懷疑。其實高級程序員並非能寫出多么高深的代碼,而是能將基礎深入骨髓,而非似乎是這樣。
補充:
看到許多熱心網友的評論,我在此補充一點:
關於cross join :笛卡爾積,就是得到多張表的乘積。
但是這里的 left join 與cross join 以及 inner join的結果會有什么區別呢?我們執行下面的語句來看看:
select * from @order o left join @Detail d on 1=1 select * from @order o inner join @Detail d on 1=1 select * from @order cross join @Detail
得到如下結果:
這里看以看出,這三種寫法查詢出的總行數是相同的,但是left join與inner join 及cross join執行的結果組合方式有差別,這說明他們匹配的規則是不相同的。
注意 在使用CROSS JOIN關鍵字交叉連接表時,因為生成的是兩個表的笛卡爾積,因而不能使用ON關鍵字,只能在WHERE子句中定義搜索條件。
補充二:
看到很多朋友的評價,對我很有幫助,網友的力量是強大,在此表示感謝!,在此特別要提出@laskfla 的建議,如果用兩張表的nulll 列作為ON的條件會有什么結果呢?下面來看看吧:
declare @test table(ID int,description varchar(50)) declare @des table(ID int,Detail varchar(50)) insert into @test values(null,'aaaaaaaaa'),(null,'bbbbbbbbbbbb'),(null,'cccccccccc') insert into @des values(null,'111'),(null,'222222'),(null,'3333333') select * from @test select * from @des select * from @test t left join @des s on t.ID=s.ID select * from @test t inner join @des s on t.ID =s.ID
執行之后會有什么結果呢?我們拭目以待:
對於出這樣的結果我們很容易理解,也會對多表連接認識的更加深刻。
本文所講的內容都是很基礎的東西,我並不是想說明什么,而是要在這里提醒大家最容易忽略的東西,往往會讓我們摔個跟頭。所以如果你對多表連接有更深刻的認識,請留下您的寶貴意見,希望本文可以幫到部分和我一樣奮斗中的程序員。