在講MySQL的Join語法前還是先回顧一下聯(lián)結(jié)的語法,呵呵,其實連我自己都忘得差不多了,那就大家一起溫習(xí)吧(如果內(nèi)容有錯誤或有疑問,國內(nèi)關(guān)于MySQL聯(lián)結(jié)查詢的資料十分少,相信大家在看了本文后會對MySQL聯(lián)結(jié)語法有相當(dāng)清晰的了解,也不會被Oracle的外聯(lián)結(jié)的(“+”號)弄得糊涂了。
在SQL標(biāo)準(zhǔn)中規(guī)劃的(Join)聯(lián)結(jié)大致分為下面四種:
1. 內(nèi)聯(lián)結(jié):將兩個表中存在聯(lián)結(jié)關(guān)系的字段符合聯(lián)結(jié)關(guān)系的那些記錄形成記錄集的聯(lián)結(jié)。
2. 外聯(lián)結(jié):分為外左聯(lián)結(jié)和外右聯(lián)結(jié)。
左聯(lián)結(jié)A、B表的意思就是將表A中的全部記錄和表B中聯(lián)結(jié)的字段與表A的聯(lián)結(jié)字段符合聯(lián)結(jié)條件的那些記錄形成的記錄集的聯(lián)結(jié),這里注意的是最后出來的記錄集會包括表A的全部錄。
右聯(lián)結(jié)A、B表的結(jié)果和左聯(lián)結(jié)B、A的結(jié)果是一樣的,也就是說:
Select A.name B.name From A Left Join B On A.id=B.id
和Select A.name B.name From B Right Join A on B.id=A.id執(zhí)行后的結(jié)果是一樣的。
3.全聯(lián)結(jié):將兩個表中存在聯(lián)結(jié)關(guān)系的字段的所有記錄取出形成記錄集的聯(lián)結(jié)(這個不需要記
憶,只要是查詢中提到了的表的字段都會取出,無論是否符合聯(lián)結(jié)條件,因此意義不大)。
4.無聯(lián)結(jié):不用解釋了吧,就是沒有使用聯(lián)結(jié)功能唄,也有自聯(lián)結(jié)的說法。
這里我有個比較簡便的記憶方法,內(nèi)外聯(lián)結(jié)的區(qū)別是內(nèi)聯(lián)結(jié)將去除所有不符合條件的記錄,而
外聯(lián)結(jié)則保留其中部分。外左聯(lián)結(jié)與外右聯(lián)結(jié)的區(qū)別在于如果用A左聯(lián)結(jié)B則A中所有記錄都會
保留在結(jié)果中,此時B中只有符合聯(lián)結(jié)條件的記錄,而右聯(lián)結(jié)相反,這樣也就不會混淆了。其實
大家回憶高等教育出版社出版的《數(shù)據(jù)庫系統(tǒng)概論》書中講到關(guān)系代數(shù)那章(就是將笛卡兒積
和投影那章)的內(nèi)容,相信不難理解這些聯(lián)結(jié)功能的內(nèi)涵。
MySQL支持Select和某些Update和Delete情況下的Join語法,具體語法上的細(xì)節(jié)有:
table_references:
table_reference [, table_reference] …
table_reference:
table_factor
| join_table
table_factor:
tbl_name [[AS] alias]
[{USE|IGNORE|FORCE} INDEX (key_list)]
| ( table_references )
| { OJ table_reference LEFT OUTER JOIN table_reference
ON conditional_expr }
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference STRAIGHT_JOIN table_factor
| table_reference STRAIGHT_JOIN table_factor ON condition
| table_reference LEFT [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [LEFT [OUTER]] JOIN table_factor
| table_reference RIGHT [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor
join_condition:
ON conditional_expr | USING (column_list)
上面的用法摘自權(quán)威資料,不過大家看了是否有點暈?zāi)兀亢呛牵瑧?yīng)該問題主要還在于
table_reference是什么,table_factor又是什么?這里的table_reference其實就是表
的引用的意思,因為在MySQL看來,聯(lián)結(jié)就是一種對表的引用,因此把需要聯(lián)結(jié)的表定義為
table_reference,同時在SQL Standard中也是如此看待的。而table_factor則是MySQL
對這個引用的功能上的增強(qiáng)和擴(kuò)充,使得引用的表可以是括號內(nèi)的一系列表,如下面例子中的
JOIN后面括號:
Select * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
這個語句的執(zhí)行結(jié)果和下面語句其實是一樣的:
Select * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
這兩個例子不僅讓我們了解了MySQL中table_factor和table_reference含義,同時能理解
一點CROSS JOIN的用法,我要補(bǔ)充的是在MySQL現(xiàn)有版本中CROSS JOIN的作用和INNER
JOIN是一樣的(雖然在SQL Standard中是不一樣的,然而在MySQL中他們的區(qū)別僅僅是
INNER JOIN需要附加ON參數(shù)的語句,而CROSS JOIN不需要)。
既然說到了ON語句,那就解釋一下吧,ON語句其實和Where語句功能大致相當(dāng),只是這里的ON
語句是專門針對聯(lián)結(jié)表的,ON語句后面的條件的要求和書寫方式和Where語句的要求是一樣
的,大家基本上可以把ON當(dāng)作Where用。
大家也許也看到了OJ table_reference LEFT OUTER JOIN table_reference這個句子,
這不是MySQL的標(biāo)準(zhǔn)寫法,只是為了和ODBC的SQL語法兼容而設(shè)定的,我很少用,Java的人更
是不會用,所以也不多解釋了。