我的 JOIN 語法無效嗎?我是否正確理解了 JOIN ?
我一直在閱讀有關 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 =
)我總是得到預期的結果,所以我從來沒有想過。但這是錯的嗎?或者是否存在我還不知道的情況,這可能會失敗並返回意外結果?
關於
LEFT
和RIGHT
加入的附加問題。說連接表(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 邊的順序無關緊要,它們仍然是相等的。至於
LEFT
andRIGHT
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 的。
在相等條件中,我喜歡按照它們在查詢中出現的相同順序列出表。這只是個人喜好,從技術角度來看,如果您交換
=
操作員的兩側並沒有什麼區別。顯然,對於更複雜的(不)等式語句或條件表達式,您可能不得不即興發揮。對於外連接,
LEFT
vs.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
使用括號允許您在可選的外部聯接之前對內部(必需)聯接進行邏輯評估,從而防止對記錄進行不希望的過濾。