標籤:mysql join summary
1. JOIN文法(精簡後)
table_reference:
table_factor
| join_table
table_factor:
table_subquery [AS] alias
| ( table_references )
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
join_condition:
ON conditional_expr
| USING (column_list)
2. JOIN分類: 內串連, 外串連.
2.1 內串連(INNER JOIN)
a. 在MySQL中, JOIN, CROSS JOIN, and INNER JOIN文法是等價的; 不指定ON條件, 得到的是笛卡爾積(That is, each and every row in the first table is joined to each and every row in the second table).
b. 內串連(INNER JOIN), 或稱等值串連, 其只顯示滿足條件的記錄.
若表left_tbl和right_tbl, 在表示內串連時, 有兩種形式: left_tbl INNER JOIN right_tbl, 和left_tbl,(comma) right_tbl. 該兩種形式在文法上是等價的, 但是JOIN的優先順序高於,(comma operator), 混用時可能產生錯誤, 最好使用JOIN.
內串連的兩種表現形式, 分別對應了兩種擷取資料的方式: ON, 和WHERE. 在使用ON時, 也都可以改寫為,(comma). 但ON說明的是: 如何完成表間的JOIN操作, 而WHERE只是在結果集種過濾出滿足條件的記錄, 含義還是有區別的.
2.2 外串連(OUTER JOIN)
a. 外串連有兩種形式: LEFT | RIGHT [OUTER] JOIN(OUTER可省略), 常見用於擷取在表left_tbl, 而不在表right_tbl中的資料.
SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
b. 若表a, 和b中有相同的欄位, 如c1, c2, c3, 那麼下面的兩種寫法是等價的:
a LEFT JOIN b USING (c1, c2, c3)
a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2 AND a.c3 = b.c3
c. 對於a LEFT JOIN b USING (c1, c2, c3), 和a NATURAL LEFT JOIN b擷取的結果集, 有稍許不同, 後者刪除了重複欄位. 這裡NATURAL暫看成個關鍵字吧, 可和內外串連結合使用, NATURAL JOIN的特點是, 同名欄位相串連, 且去重. 其實際作用不大.
本文出自 “感動自己” 部落格,請務必保留此出處http://coveringindex.blog.51cto.com/12533373/1953568
MySQL JOIN Summary