MySQL Left Join,Right Join

在講MySQL的Join語法前還是先回顧一下聯結的語法,呵呵,其實連我自己都忘得差不多了,那就大家一起溫習吧(如果內容有錯誤或有疑問,國內關於MySQL聯結查詢的資料十分少,相信大家在看了本文後會對MySQL聯結語法有相當清晰的瞭解,也不會被Oracle的外聯結的(“+”號)弄得糊塗了。

在SQL標準中規劃的(Join)聯結大致分爲下面四種:

1. 內聯結:將兩個表中存在聯結關係的字段符合聯結關係的那些記錄形成記錄集的聯結。

2. 外聯結:分爲外左聯結和外右聯結。

左聯結A、B表的意思就是將表A中的全部記錄和表B中聯結的字段與表A的聯結字段符合聯結條件的那些記錄形成的記錄集的聯結,這裏注意的是最後出來的記錄集會包括表A的全部記錄。

右聯結A、B表的結果和左聯結B、A的結果是一樣的,也就是說:

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執行後的結果是一樣的。

3.全聯結:將兩個表中存在聯結關係的字段的所有記錄取出形成記錄集的聯結(這個不需要記憶,只要是查詢中提到了的表的字段都會取出,無論是否符合聯結條件,因此意義不大)。

4.無聯結:不用解釋了吧,就是沒有使用聯結功能唄,也有自聯結的說法。

這裏我有個比較簡便的記憶方法,內外聯結的區別是內聯結將去除所有不符合條件的記錄,而外聯結則保留其中部分。外左聯結與外右聯結的區別在於如果用A左聯結B則A中所有記錄都會保留在結果中,此時B中只有符合聯結條件的記錄,而右聯結相反,這樣也就不會混淆了。其實大家回憶高等教育出版社出版的《數據庫系統概論》書中講到關係代數那章(就是將笛卡兒積和投影那章)的內容,相信不難理解這些聯結功能的內涵。

MySQL支持Select和某些Update和Delete情況下的Join語法,具體語法上的細節有:

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)

上面的用法摘自權威資料,不過大家看了是否有點暈呢?呵呵,應該問題主要還在於table_reference是什麼,table_factor又是什麼?這裏的table_reference其實就是表的引用的意思,因爲在MySQL看來,聯結就是一種對錶的引用,因此把需要聯結的表定義爲table_reference,同時在SQL Standard中也是如此看待的。而table_factor則是MySQL對這個引用的功能上的增強和擴充,使得引用的表可以是括號內的一系列表,如下面例子中的JOIN後面括號:

SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

這個語句的執行結果和下面語句其實是一樣的:

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的用法,我要補充的是在MySQL現有版本中CROSS JOIN的作用和INNER JOIN是一樣的(雖然在SQL Standard中是不一樣的,然而在MySQL中他們的區別僅僅是INNER JOIN需要附加ON參數的語句,而CROSS JOIN不需要)。

既然說到了ON語句,那就解釋一下吧,ON語句其實和WHERE語句功能大致相當,只是這裏的ON語句是專門針對聯結表的,ON語句後面的條件的要求和書寫方式和WHERE語句的要求是一樣的,大家基本上可以把ON當作WHERE用。

大家也許也看到了OJ table_reference LEFT OUTER JOIN table_reference這個句子,這不是MySQL的標準寫法,只是爲了和ODBC的SQL語法兼容而設定的,我很少用,Java的人更是不會用,所以也不多解釋了。

sql:inner join,left join,right join,full join的用法及含義

join的語法如下:
select [字段] from [表名1] inner/left/right/full join [表名2] on [表名1.字段1] <關係運算符> [表名2.字段2]
 
cross join:是笛卡兒乘積,在沒有任何條件約束下就是一張表的行數乘以別一張表的行數。
left join:返回“表名1”的全部行,對於“表名2”中,不滿足on條件的記錄用空值替換。
rigth join:返回“表名2”的全部行,對於“表名1”中,不滿足on條件的記錄用空值替換。
full join:返回兩張表中的所有記錄,對於不滿足on條件一端的記錄用空值替換。
inner jon:只返回兩張表中都滿足on條件的記錄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章