mysql表連線總結

2021-07-05 19:59:38 字數 3012 閱讀 2849



首先my sql 不支援oracle的(+) 

內連線: 只連線匹配的行

左外連線: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行

右外連線: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行

全外連線: 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。

交叉連線  生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將乙個資料來源中的每個行與另乙個資料來源的每個

行都一一匹配

舉個例子吧。

表aid   name 

1    張

2    李

3    王

表bid   address   a_id

1    北京      1

2    上海      3

3    南京      10

包容性: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

王     上海

包容性: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     南京

排他性: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 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

注釋:返回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.連線欄位建索引

多表外連線

select   a.*,b.f1,b.f2,b.fn,c.f1,c.f2,c.fn   from   a    

left   join   b   on   a.id=b.id    

left   join   c   on   c.id=a.id  

where .......

mysql表連線sql表 MYSQL表連線查詢

表連線查詢 一 交叉連線 笛卡爾積 查詢teacher和course表中所有的資料 select from teacher,course select name,courseid,course.id,cname from teacher,course where teacher.courseid c...

表連線總結

通過連線運算子可以實現多個表查詢。連線是關聯式資料庫模型的主要特點,也是它區別於其它型別資料庫管理系統的乙個標誌。連線型別可分為三種 內連線 外連線和交叉連線。下面分別介紹連線型別及特點。例項表buyer buyer id,buyer name sales sales id,buyer id,qty...

mysql表連線自己本身 mysql連線表本身

我遇到了這個問題,我希望它是可能的.我有乙個來自wordpress的表,用於儲存後元資料,因此無法更改列和字段資料 輕鬆 因此,表結構 post id meta key meta value 元鍵儲存欄位名稱和meta value,即該字段的值.我需要根據帖子id對這些進行分組,這樣我就可以在兩個字...