1. 程式人生 > >多表關聯和左、右連線,內連線

多表關聯和左、右連線,內連線

多表連線

首先要介紹一下集合的概念:集合具有無序性、唯一性。

無序性:指集合內部元素沒有相對順序的概念,對於兩個集合而言,只要元素值和元素個數相同則兩個集合相等。

唯一性:指集合內部元素不存在值相等的元素。

上圖所示集合是錯誤的,因為有2個‘3’違背了唯一性

上圖所示的兩個集合是相同的,集合元素是無序的

集合的運算:交集、並集、相乘

交集:兩個集合公共元素組成的集合

並集:連個集合所有元素組成的集合

相乘:也成笛卡爾積,兩個集合所有元素組合的集合


集合1*集合2的結果如下:

其中(1,3)是集合1中的‘1’和集合2中的‘3’的組合

一張表其實就相當於一個集合,每一行是集合的一個元素

現在有兩表

goods表:包含商品ID,欄目ID,商品名,有8個商品


channel表:欄目ID,欄目名,有3個欄目


想在想得到一張報價單包含商品ID,商品名,欄目ID,欄目名,該如何去做?

全相乘:笛卡爾積 總共有3*8=24 條記錄

即兩表各個行的所有組合

選出其中滿足要求的行


雖然得出了正確答案,但是如果goods表和channel表很大的話,如goods表有1W條記錄,channel也有1W條記錄。則需要在記憶體中生成一張1W*1W的臨時表,而且絕大部分記錄都不是我們所需的。所以全相乘浪費了空間、降低了效率。

左連線:語法 表1 left join 表2 on 條件

以表1為基準選出滿足條件的表2的行


右連線:語法 表2 right join 表1 on 條件  等價於 表1 left join 表2 on 條件

所以左右連線往往可以互換,但是右連線有點反邏輯思維,建議選用左連線。


內連線:語法 表1 inner join 表2 on 條件


可見左右連線、內連線、全相乘都可以完成所要求的功能,但是全相乘的效率是最低的,因為全相乘生成的是一張很大的臨時表,而且沒有索引。

以左連線為例 “A left join B on 條件” 其實相當於一張臨時表,包含A表和B表所有的欄位,以及滿足條件的B的所有的行。而且後面可以接where 等子句。

多表聯查:

A ,B,C,D表關聯

A left join B on 條件1 left join C on 條件2 left join D on 條件3


左右連線和內連線的區別

現有兩張表

第一張表為男生表,記錄了男生的姓名和配偶的編號

第二張表為女生表,記錄了女生的姓名和自己的編號


第一種情況:主持人請所有男生都上臺,並且帶上自己的配偶。這時不管男生有沒有配偶都要上臺,所以是以男生表為基準關聯女生表

可以考慮用左連線


屌絲比較悲劇,在女生表中沒有他的配偶,所以gname和gname.other都為NULL。高富帥肯定美女環抱,所以有多行記錄。

第二種情況:主持人請所有女生都上臺,並且帶上自己的配偶。這時不管女生有沒有配偶都要上臺,所以是以女生表為基準關聯男生表

可以考慮用左連線


小美也比較悲劇,在男生表中沒有對應的配偶,所以bname和bname.other都為NULL。至於小嬌、小芝、小琳跟高富帥和小王的關係就比較亂了,也有多行。

第三種情況:主持人請所有有配偶的男女生上臺,這是就可以用內連線了


可見boy left join girl on boy.other = girl.other含義是:在girl表中找到滿足條件boy.other = girl.other的行與boy表中對應的行組合,boy表中沒有在girl表中匹配的行補NULL。

左右連線及內連線的關係:

左右連線可以相互轉換。A left join B on 條件 等價於 B left join A on 條件

內連線 A inner join B on 條件 是   A left join B on 條件 和 B right join A on 條件的交集。