什麼是JOIN?JOIN的實際運用

2021-12-30 12:05:46 字數 2911 閱讀 3534

通俗的講:

a left join b 的連線的記錄數與a表的記錄數同

a right join b 的連線的記錄數與b表的記錄數同

a left join b 等價b right join a

select * from a inner join b on a.id=b.id

這個語法是連線查詢中的內連線,它產生的結果是

兩個表相匹配的記錄出現在結果列表中。

select * from a,b where a.id=b.id

這個語法是內連線的另外一種寫法,其執行結果與inner join 一樣

select * from a left/right join b on a.id=b.id

這個是外連線語法中的左外連線或右外連線

如果是左外連線的話,它將顯示a表的所有記錄,

如果是右外連線的話,它將顯示b表的所有記錄,

select a.*,b.* from a left join b on a.k = b.k

select a.*,b.* from a left outer join b on a.k =b.k

----------上面兩種一樣left join是left outer join的簡寫

在你要使用多個left join的時候

比如說10個

我們把10個全都寫成left join的形式

然後再sql讓他自動執行一下,它會把最後一次出現的left join變成left outer join

所以依此推理,最後乙個left join會以left outer join的形式存在

當然,不管變不變對結果的顯示沒有任何影響

使用關係代數合併資料

1 關係代數

合併資料集合的理論基礎是關係代數,它是由e.f.codd於2023年提出的。

在關係代數的形式化語言中:

 用表、或者資料集合表示關係或者實體。

 用行表示元組。

 用列表示屬性。

關係代數包含以下8個關係運算子

 選取――返回滿足指定條件的行。

 投影――從資料集合中返回指定的列。

 笛卡爾積――是關係的乘法,它將分別來自兩個資料集合中的行以所有可能的方式進行組合。

 並――關係的加法和減法,它可以在行的方向上合併兩個表中的資料,就像把乙個表壘在另乙個表之上一樣。

 交――返回兩個資料集合所共有的行。

 差――返回只屬於乙個資料集合的行。

 連線――在水平方向上合併兩個表,其方法是:將兩個表中在共同資料項上相互匹配的那些行合併起來。

 除――返回兩個資料集之間的精確匹配。

此外,作為一種實現現代關係代數運算的方法,sql還提供了:

 子查詢――類似於連線,但更靈活;在外部查詢中,方式可以使用表示式、列表或者資料集合的地方都可以使用子查詢的結果。

cross join 笛卡爾乘積(所有可能的行對)

inner join 僅對滿足連線條件的cross中的列

left outer join 乙個表滿足條件的行,和另乙個表的所有行

right outer join 與left相同,但兩個表的角色互換

full outer join left outer 和 right outer中所有行的超集

2.2 內連線(inner join)

內連線是最常見的一種連線,它頁被稱為普通連線,而e.fcodd最早稱之為自然連線。

2.3 外連線

2.3.1 左外連線(left outer jion)

2.3.2 右外連線(rigt outer jion)

其中outer可以省略。

2.3.3 全外連線(full outer)

全外連線返回參與連線的兩個資料集合中的全部資料,無論它們是否具有與之相匹配的行。在功能上,它等價於對這兩個資料集合分別進行左外連線和右外連線,然後再使用消去重複行的並操作將上述兩個結果集合並為乙個結果集。

2.3.4 外連線與條件配合使用

select *

from t_institution i

left outer join t_teller t

on i.inst_no = t.inst_no

and i.inst_no = 「5801」

2.4 自身連線

自身連線是指同乙個表自己與自己進行連線。這種一元連線通常用於從自反關係(也稱作遞迴關係)中抽取資料。

下面例子是在機構表中查詢本機構和上級機構的資訊。

select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name

from t_institution i

join t_institution s

on i.superior_inst = s.inst_no

結果是:

superior_inst sup_inst_name inst_no inst_name

800 廣州市 5801 天河區

800 廣州市 5802 越秀區

800 廣州市 5803 白雲區

2.5 交叉(無限制) 連線

交叉連線用於對兩個源表進行純關係代數的乘運算。它不使用連線條件來限制結果集合,而是將分別來自兩個資料來源中的行以所有可能的方式進行組合。資料集合中一的每個行都要與資料集合二中的每乙個行分別組成乙個新的行。例如,如果第乙個資料來源中有5個行,而第二個資料來源中有4個行,那麼在它們之間進行交叉連線就會產生20個行。人們將這種型別的結果集稱為笛卡爾乘積。

大多數交叉連線都是由於錯誤操作而造成的;但是它們卻非常適合向資料庫中填充例子資料,或者預先建立一些空行以便為程式執行期間所要填充的資料保留空間。

select *

from t_institution i

cross join t_teller t

在交叉連線中沒有on條件子句

什麼是運維?什麼是遊戲運維?

1 運維是指大型組織已經建立好的網路軟硬體的維護,就是要保證業務的上線與運作的正常,在他運轉的過程中,對他進行維護,他集合了網路 系統 資料庫 開發 安全 監控於一身的技術 運維又包括很多種,有dba運維 運維 虛擬化運維 監控運維 遊戲運維等等 2 遊戲運維又有分工,分為開發運維 應用運維 業務運...

什麼是運維?什麼是遊戲運維?

1 運維是指大型組織已經建立好的網路軟硬體的維護,就是要保證業務的上線與運作的正常,在他運轉的過程中,對他進行維護,他集合了網路 系統 資料庫 開發 安全 監控於一身的技術 運維又包括很多種,有dba運維 運維 虛擬化運維 監控運維 遊戲運維等等 2 遊戲運維又有分工,分為開發運維 應用運維 業務運...

什麼是運維?什麼是遊戲運維?

1 運維是指大型組織已經建立好的網路軟硬體的維護,就是要保證業務的上線與運作的正常,在他運轉的過程中,對他進行維護,他集合了網路 系統 資料庫 開發 安全 監控於一身的技術 運維又包括很多種,有dba運維 運維 虛擬化運維 監控運維 遊戲運維等等 2 遊戲運維又有分工,分為開發運維 應用運維 業務運...