mysql 逗号 join_关于sql:MySQL中逗号分隔的连接和语法连接有什么区别?
本問題已經(jīng)有最佳答案,請猛點這里訪問。
例如,如果我有一個表"person",其列"id"引用表"worker"中的列"id"
這兩個查詢之間的區(qū)別是什么?它們產生相同的結果。
SELECT *
FROM Person
JOIN Worker
ON Person.id = Worker.id;
和
SELECT *
FROM Person,
Worker
WHERE Person.id = Worker.id;
號
謝謝
完全沒有區(qū)別。
第二種表示形式使查詢更具可讀性,并使查詢看起來非常清楚哪個聯(lián)接對應于哪個條件。
性能有什么不同嗎?PostgreSQL怎么樣?
性能絕對沒有差別。在這兩種情況下,由SQL Server準備的最終版本是相同的。
對于更大的查詢,我會說第一種方法更具可讀性。如果您有一個混合左聯(lián)接和一些內部聯(lián)接,那么在聯(lián)接子句中使用聯(lián)接條件要比在聯(lián)接子句中使用一些條件和在WHERE子句中使用一些條件一致得多。
第一種方法是更加可讀和明確
這個答案不正確。在dev.mysql.com/doc/refman/5.5/en/join.html頁面上的mysql手冊中,它指出:"但是,逗號運算符的優(yōu)先級低于內部聯(lián)接、交叉聯(lián)接、左聯(lián)接等。如果在存在聯(lián)接條件時將逗號聯(lián)接與其他聯(lián)接類型混合,則可能會出現(xiàn)"on子句"中未知列"col_name"的格式錯誤。
@CaptainPayAlytic:問題中給出的兩個查詢在邏輯上是等效的。正如你指出的,這兩個符號實際上是有區(qū)別的。(我同意你的看法,這個答案是錯誤的。實際上,這兩個查詢之間存在差異…我們可以說,一個使用舊的逗號語法進行連接操作,另一個使用join關鍵字。)
除前面的注釋外,使用第一種格式,您可以將所有聯(lián)接條件分組到ON子句中,讓WHERE子句為您的數(shù)據(jù)指定篩選器(注意,可以編寫用作篩選器的聯(lián)接條件,但一般來說,保持這種做法會使代碼更具可讀性)。
這些查詢在邏輯上是等價的。逗號運算符等價于[INNER] JOIN運算符。
逗號是舊樣式的聯(lián)接運算符。join關鍵字是在后面添加的,因為它還允許外部聯(lián)接操作,所以比較受歡迎。
它還允許將連接謂詞(條件)與WHERE子句分隔成ON子句。這提高了(人類)的可讀性。
跟進
此答案表示問題中的兩個查詢是等效的。在同一個查詢中,我們不應該將舊的join操作逗號語法與新的JOIN關鍵字語法混合使用。如果我們真的混合了它們,我們需要知道優(yōu)先級順序的不同。
摘自MySQL參考手冊
https://dev.mysql.com/doc/refman/5.6/en/join.html網(wǎng)站
INNER JOIN and , (comma) are semantically equivalent in the absence of a join condition: both produce a Cartesian product between the specified tables (that is, each and every row in the first table is joined to each and every row in the second table).
However, the precedence of the comma operator is less than that of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur. Information about dealing with this problem is given later in this section.
號
逗號是1=1上的交叉聯(lián)接或內部聯(lián)接。它的優(yōu)先級低于關鍵字聯(lián)接。上的內部聯(lián)接是用逗號和where定義的。
除了可讀性更好之外,還有一種情況是顯式聯(lián)接的表更好,而不是逗號分隔的表。
讓我們看一個例子:
下面的查詢將給出兩個表中的所有列和行
SELECT
*
FROM table1, table2
號
下面的查詢將給出表別名為"table2"的第一個表中的列
SELECT
*
FROM table1 table2
如果您錯誤地忘記了逗號分隔聯(lián)接中的逗號,則第二個表將自動轉換為第一個表的表別名。并非所有情況下都如此,但有可能出現(xiàn)這種情況
如果table1和table2是無關的,我會把這里的FROM逗號語法放在可選的和更冗長的INNER JOIN table2 ON 1 = 1之上,因為ON謂詞是多余的。
@Mattarnold:對于MySQL,ON子句是可選的。ON 1=1沒有作用,是不必要的。此外,inner關鍵字是可選的,沒有任何效果。也就是說,FROM table1 JOIN table2就足夠了,盡管在這種情況下,在on或where子句中沒有連接條件,我們可以包括可選的CROSS關鍵字,以幫助將來的讀者。幫助讀者理解缺少連接條件是有意的。即FROM table1 CROSS JOIN table2。我認為這種形式比逗號語法更清楚地傳達了我們的意圖。
使用連接使代碼更容易閱讀,因為它是不言而喻的。
在速度上沒有區(qū)別(我測試過),執(zhí)行計劃是相同的
如果查詢優(yōu)化器做得很好,那么這些查詢之間應該沒有區(qū)別。它們只是指定相同期望結果的兩種方法。
The SELECT * FROM table1, table2, etc.對于幾個表來說是好的,但是隨著表的數(shù)量的增加,它變得成倍的困難。
JOIN語法明確了什么條件影響哪些表(給出條件)。另外,第二種方法是舊標準。
但是,在數(shù)據(jù)庫中,它們最終是相同的
指數(shù)難度?怎樣?為了誰?
總結
以上是生活随笔為你收集整理的mysql 逗号 join_关于sql:MySQL中逗号分隔的连接和语法连接有什么区别?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java t没有缩进,Github上Ja
- 下一篇: 怎么取消电脑登录页面设置密码 如何取消电