1. 程式人生 > >mysql內連線、左外連線、右外連線、全連線詳解

mysql內連線、左外連線、右外連線、全連線詳解

內連線: 只連線匹配的行
左外連線: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
右外連線: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
全外連線: 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
交叉連線: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配


舉個例子吧。
表A
id   name  
1    張
2    李
3    王

表B
id   address   A_id
1    北京      1
2    上海      3
3    南京      10
/******************************** left join  左連線*****************************************/
包容性:A表包容B表,左連線左表是全的.(left join 或 left outer join )
SQL語句如下:
SELECT A.name, B.address
FROM A
LEFT JOIN B ON A.id = B.A_id 
查詢結果為:
name     address
張     北京
李     NULL
王     上海
/******************************** right join  右連線*****************************************/
包容性:B表包容A表,右連線右表是全的.(right join 或 right outer join )
SQL語句如下:
SELECT A.name, B.address
FROM A
RIGHT JOIN B ON A.id = B.A_id 
查詢結果為:
name     address
張     北京
王     上海
NULL     南京
/******************************** inner join  內連線*****************************************/
排他性:A,B表中至少有1個匹配時,才返回行。兩表的交集
SQL語句如下:
select A.name,B.address from A 
inner join B
on A.id = B.A_id

查詢結果為:
name     address
張     北京
王     上海
inner join  內連線等價於下面的sql:
SELECT A.name, B.address
FROM A, B
WHERE A.id = B.A_id
/******************************** full join  全連線*****************************************/
註釋:全外連線返回參與連線的兩個資料集合中的全部資料,無論它們是否具有與之相匹配的行。在功能上,它等價於

對這兩個資料集合分別進行左外連線和右外連線,然後再使用消去重複行的並操作將上述兩個結果集合併為一個結果集

。(full join 或 full outer join )
SQL語句如下:
select * from A 
full join B
查詢結果為:
id     name     id     address A_id
1     張     1     北京     1
2     李     1     北京     1
3     王     1     北京     1
1     張     2     上海     3
2     李     2     上海     3
3     王     2     上海     3
1     張     3     南京     10
2     李     3     南京     10
3     王     3     南京     10
/******************************** CROSS JOIN(不帶條件where...)***********************************/
註釋:返回3*3=9條記錄,即笛卡爾積 
SQL語句如下:
SELECT * FROM A
CROSS JOIN B
查詢結果為:
id     name     id     address A_id
1     張     1     北京     1
2     李     1     北京     1
3     王     1     北京     1
1     張     2     上海     3
2     李     2     上海     3
3     王     2     上海     3
1     張     3     南京     10
2     李     3     南京     10
3     王     3     南京     10
CROSS JOIN等價於:
select * from A,B 

注意:
1. on A.id = B.id 等同於 using(id)//這裡欄位名要相同
2. 當 MySQL 在從一個表中檢索資訊時,你可以提示它選擇了哪一個索引。   
如果 

EXPLAIN 顯示 MySQL 使用了可能的索引列表中錯誤的索引,這個特性將是很有用的。   
通過指定 USE INDEX (key_list),你可以告訴 MySQL 使用可能的索引中最合適的一個索引在表中查詢記錄行。   
可選的二選一句法 IGNORE INDEX (key_list) 可被用於告訴 MySQL 不使用特定的索引。     


效率問題:
1.inner join比left join快
注:inner join  內連線等價於下面的sql: SELECT A.name, B.address FROM A, B WHERE A.id = B.A_id
所以一般要用一般的連線就可以了.
2.連線欄位建索引