手把手教你寫 SQL Join 聯接

2021-09-30 07:44:50 字數 2735 閱讀 6556

手把手教你寫 sql join 聯接

聯接型別

在關係代數中,聯接運算是由乙個笛卡爾積運算和乙個選取運算構成的。首先用笛卡爾積完成對兩個資料集合的乘運算,然後對生成的結果集合進行選取運算,確保只把分別來自兩個資料集合並且具有重疊部分的行合併在一起。聯接的全部意義在於在水平方向上合併兩個資料集合(通常是表),並產生乙個新的結果集合,其方法是將乙個資料來源中的行於另乙個資料來源中和它匹配的行組合成乙個新元組。

本文從幾個簡單的例子裡,手把手教你如何寫內聯接、左外聯接、右外聯接、全外聯接以及交叉聯接。

sql 提供了多種型別的聯接方式,它們之間的區別在於:從相互交疊的不同資料集合中選擇用於聯接的行時所採用的方法不同。

內聯接:只聯接匹配的行;

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

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

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

(h)(theta)聯接:使用等值以外的條件來匹配左、右兩個表中的行;

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

在 informix 中聯接表的查詢。如果 from 子句指定了多於乙個表引用,則查詢會聯接來自多個表的行。聯接條件指定各列之間(每個表至少一列)進行聯接的關係。因為正在比較聯接條件中的列,所以它們必須具有一致的資料型別。

select 語句的 from 子句可以指定以下幾種型別的聯接:

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

inner join:僅對滿足聯接條件的 cross 中的列;

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

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

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

示例詳解

建立 t_student 表:

建立 t_score 表:

一、外聯接

1、概念:包括左向外聯接、右向外聯接或完整外部聯接。

2、左聯接:left join 或 left outer join。

1)左向外聯接的結果集包括 left outer 子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值(null)。

2)sql 語句:

結果集:

注釋:包含 t_student 的所有子句,根據指定條件返回 t_score 相應的字段,不符合的以 null 顯示。

3、右聯接:right join 或 right outer join。

1)右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

2)sql 語句:

結果集:

注釋:包含 t_score 的所有子句,根據指定條件返回 t_student 相應的字段,不符合的以 null 顯示。

4、完整外部聯接:full join 或 full outer join。

1)完整外部聯接返回左表和右表中的所有行。當某行在另乙個表中沒有匹配行時,則另乙個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。

2)sql 語句:

結果集:

注釋:返回左右連線的和(見上左、右連線),即:返回左右聯接的結果集的並集。

二、內聯接

1、概念:內聯接是用比較運算子比較要聯接列的值的聯接。

2、內聯接:join 或 inner join。

3、sql 語句:

結果集:

注釋:只返回符合條件的 t_student 和 t_score 的列,即:返回左右聯接的結果集的交集。

4、等價(與下列執行效果相同):

a:select a.*,b.* from t_student a,t_score b where a.id=b.id

b:select * from t_student cross join t_score where t_student.id=t_score.id(注:cross join 後加條件只能用 where,不能用 on)

三、交叉聯接(完全)

1、概念:沒有 where 子句的交叉聯接將產生聯接所涉及的表的笛卡爾積。第乙個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小(t_student 和 t_score 交叉聯接產生 3 * 3 = 9 條記錄)。

2、交叉聯接:cross join(不帶條件 where...)。

3、sql語句:

結果集:

注釋:返回 3 * 3 = 9 條記錄,即笛卡爾積。

4、等價(與下列執行效果相同):

a:select * from t_student,t_score

手把手教你寫Undo Redo程式

手把手教你寫 undo redo程式 undo redo 操作是很多具體編輯功能的軟體所不能缺少的。最典型兩種型別就是文字編輯和影象編輯軟體。然而它的實現在某種程度上來說也不是很簡單。我也廢話少說。要在程式中支援 undo redo 操作,就需要儲存一些必要的資訊,這個是眾所周知的。如果想支援無限級...

手把手教你寫Undo Redo程式

手把手教你寫undo redo程式 undo redo操作是很多具體編輯功能的軟體所不能缺少的。最典型兩種型別就是文字編輯和影象編輯軟體。然而它的實現在某種程度上來說也不是很簡單。我也廢話少說。要在程式中支援undo redo操作,就需要儲存一些必要的資訊,這個是眾所周知的。如果想支援無限級的und...

手把手教你寫ORM(三)

昨天處於暈死狀態,少寫了乙個元件,還需要乙個元件用來專門管理cache的,這裡說道為什麼要分這麼多元件,其實這是習慣問題,很多人喜歡寫乙個很大的dll,不過我比較喜歡拆分,小粒度的專案比較好管理和單獨測試,把用單元測試驗證好了的小組件湊起來除錯和寫成乙個巨大的dll慢慢一行行的追蹤 肯定是前者更加舒...