怎么回事呀?(乳頭硬疼是怎么回事呀)
1759
2022-05-30
轉自:http://blog.csdn.net/huanghanqian/article/details/52847835
四種join的區別已老生常談:
INNER JOIN(也可簡寫為JOIN): 如果表中有至少一個匹配,則返回行
LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN: 只要其中一個表中存在匹配,就返回行
那么問題來了,還有一種常見的寫法是將表用逗號隔開,那這個又是怎么連接的呢。
先看這兩張表。
使用逗號隔開的方法來連接表:
SELECT * FROM employee,department 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 employee,department 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
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。