Mysql

我的 JOIN 語法無效嗎?我是否正確理解了 JOIN ?

  • January 14, 2014

我一直在閱讀有關 JOIN 的一些資訊。我只是注意到我寫的語法有點不同。雖然我不認為有什麼問題,但我想听聽你的意見。

這就是我看到幾乎每個教程都編寫語法的方式:

SELECT a.<columns>
   b.<columns> 
FROM table_a a 
   INNER JOIN table_b b ON a.pk = b.fk_table_a_pk

這就是我一直在做的事情:

SELECT a.<columns>
   b.<columns> 
FROM table_a a 
   JOIN table_b b ON b.fk_table_a_pk = a.pk

如你看到的; 我已經切換了進行比較的部分。

而不是a.pk = b.fk_table_a_pk,我願意b.fk_table_a_pk = a.pk。我不知道為什麼,但我猜這是因為在我的腦海中繼續在連接表上“工作”更有意義(JOIN table_b b ON b.fk_table_a_pk =

我總是得到預期的結果,所以我從來沒有想過。但這是錯的嗎?或者是否存在我還不知道的情況,這可能會失敗並返回意外結果?

關於LEFTRIGHT加入的附加問題。

說連接表(table_b)是RIGHT表是否正確?- 那 table_a 是LEFT表 - 在這種情況下?

如果我繼續這樣的程式碼:

....
FROM table_a a 
   JOIN table_b b ON b.fk_table_a_pk = a.pk
   JOIN table_c c ON c.fk_table_a_pk = a.pk

它們都是RIGHT相對於 table_a 的表?如果我繼續這樣:

   ....
   JOIN table_c c ON c.fk_table_a_pk = a.pk
       JOIN table_d ON d.fk_table_c_pk = c.pk

現在 table_c 仍然RIGHT相對於 table_a,但現在也LEFT相對於 table_d - 當然 table_dRIGHT相對於 table_c - 在這種情況下?

=符號表示對稱等號運算符。提到 to 邊的順序無關緊要,它們仍然是相等的。

至於LEFTand RIGHT JOIN,這裡的表格順序很重要。正如你所說的正確,它是:

...FROM LeftTable LEFT JOIN RightTable ON...

...FROM LeftTable RIGHT JOIN RightTable ON...

LEFT JOIN無論匹配如何,都返回 LeftTable 的所有行,無論匹配如何,都返回RightTable 的RIGHT JOIN所有行。

有關如何JOIN工作的更多資訊,請在此處查看我的文章系列:http: //sqlity.net/en/1146/a-join-a-day-introduction/

它是為 Microsoft SQL Server 編寫的,但大多數概念都是獨立於 RDBMS 的。

在相等條件中,我喜歡按照它們在查詢中出現的相同順序列出表。這只是個人喜好,從技術角度來看,如果您交換=操作員的兩側並沒有什麼區別。顯然,對於更複雜的(不)等式語句或條件表達式,您可能不得不即興發揮。

對於外連接,LEFTvs.RIGHT名稱只是為了告訴 DBMS 連接的哪個“側”應該返回所有記錄,而不管不存在匹配項。完全外連接包括來自雙方的所有記錄。第一個列出的表被認為是“左”,第二個列出的表被認為是“右”。

潛在的外部連接陷阱:

SELECT *
FROM a
   LEFT OUTER JOIN b
       ON a.a_id = b.a_id
   INNER JOIN c
       ON b.b_id = c.b_id

這有效地將您的外部聯接變成了內部聯接,因為 和 之間的聯接b不是c可選的。您可能希望像這樣編寫表達式,將記錄加入a到記錄中b,但前提是它們與記錄匹配c

SELECT *
FROM a
   LEFT OUTER JOIN (
       b
       INNER JOIN c
           ON b.b_id = c.b_id
   )
       ON a.a_id = b.a_id

使用括號允許您在可選的外部聯接之前對內部(必需)聯接進行邏輯​​評估,從而防止對記錄進行不希望的過濾。

引用自:https://dba.stackexchange.com/questions/56773