1. 程式人生 > >sql用逗號連接多張表對應哪個join?

sql用逗號連接多張表對應哪個join?

書寫方式 表示 連接符 tps highlight 表達式 簡寫 參考資料 tails

轉自:http://blog.csdn.net/huanghanqian/article/details/52847835

四種join的區別已老生常談:

  • INNER JOIN(也可簡寫為JOIN): 如果表中有至少一個匹配,則返回行
  • LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行

那麽問題來了,還有一種常見的寫法是將表用逗號隔開,那這個又是怎麽連接的呢。

先看這兩張表。

技術分享

使用逗號隔開的方法來連接表:

SELECT *  
FROM   employeedepartment 
WHERE  employee.DepartmentID = department.DepartmentID

輸出結果:

技術分享

可以很明顯發現:這不就是inner join嘛!

沒錯,答案正是這樣:sql用逗號連接多張表對應的是 inner join。

為了嚴謹性,我到處找sql的官方文檔來證實這一點。然而搜不出來sql的文檔(誰知道網址請務必發我),最後還是在維基百科上找到了可以當作論據的話。

SQL 定義了兩種不同語法方式去表示"連接"。首先是"顯式連接符號",它顯式地使用關鍵字 JOIN,其次是"隱式連接符號",它使用所謂的"隱式連接符號"。隱式連接符號把需要連接的表放到 SELECT 語句的 FROM 部分,並用逗號隔開。這樣就構成了一個"交叉連接",WHERE 語句可能放置一些過濾謂詞(過濾條件)。那些過濾謂詞在功能上等價於顯式連接符號. SQL 89標準只支持內部連接與交叉連接,因此只有隱式連接這種表達方式;SQL 92標準增加了對外部連接的支持,這才有了JOIN
表達式。

也就是說,

SELECT *
FROM   employee 
       INNER JOIN department 
          ON employee.DepartmentID = department.DepartmentID

等價於:

SELECT *  
FROM   employeedepartment 
WHERE  employee.DepartmentID = department.DepartmentID

至於哪個效率高一點,其實兩者是一回事,沒有區別。只是內連接是由SQL 1999規則定的書寫方式而已。

另外,在寫sql語句測試4種join的時候,發現mysql對於full join返回的結果和inner join一模一樣。經查閱資料,才發現原來mysql不支持full join啊。

見:http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql

技術分享

參考資料:

1.維基百科 https://zh.wikipedia.org/wiki/%E8%BF%9E%E6%8E%A5_(SQL)

2.w3school http://www.w3school.com.cn/sql/sql_join.asp

3.CSDN博客最後一段話 http://www.cnblogs.com/huangfr/archive/2012/06/20/2555530.html

sql用逗號連接多張表對應哪個join?