mysql中的內外連線脫坑

2021-08-21 14:17:51 字數 3285 閱讀 3922

內連線: 只連線匹配的行

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

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

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

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

舉個例子吧。

表aid   name  

1    張

2    李

3    王

表bid   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.連線欄位建索引

Mysql內外連線

1.自然連線 natural join 自然連線將表中具有相同名稱的列自動進行匹配,自然連線不必指定任何同等連線條件也不能認為指定哪些列需要被匹配,自然連線得到的結果表中,兩表中名稱相同的列只出現一次。select from employee natural join department 2.內連...

Mysql 內外連線,事物,索引

表的連線分為內連和外連 內連線 內連線實際上就是利用where語句對倆個表形成的笛卡兒積進行篩選,我們前面學的所有連線都是內鏈結 語法 select 欄位名 from 表1 inner join 表2 on 連線條件 and 其他條件 例 顯示smith的名字和部門名稱 外連線 外連線分為左外連線和...

即將脫坑的感慨

如何開始乙個小點呢?最近在做去重,有兩方面,url去重與漏洞去重。關於去重,情況過於複雜。url去重,這是第一版,用正則進行mysql的匹配,刪除匹配到的url剩餘一條。這樣要寫的規則實在是太多了,如何提高效率,提高規則編寫 測試 刪除 更新的效率又是乙個問題。這些又大多是在規則編寫的過程中逐漸形成...