首先要介紹一下集合的概念:集合具有無序性、唯一性。
無序性:指集合內部元素沒有相對順序的概念,對於兩個集合而言,只要元素值和元素個數相同則兩個集合相等。
唯一性:指集合內部元素不存在值相等的元素。
上圖所示集合是錯誤的,因為有2個‘3’違背了唯一性
上圖所示的兩個集合是相同的,集合元素是無序的<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KCjxwPjxzdHJvbmc+vK+6z7XE1MvL46O6PC9zdHJvbmc+vbu8r6GisqK8r6Giz+CzyzwvcD4KPHA+vbu8r6O6wb249ryvus+5q7my1KrL2Nfps8m1xLyvus88L3A+CjxwPrKivK+jusGsuPa8r7rPy/nT0NSqy9jX6bPJtcS8r7rPPC9wPgo8cD7P4LPLo7rSsrPJtdG/qLb7u/2jrMG9uPa8r7rPy/nT0NSqy9jX6brPtcS8r7rPPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140617/2014061708594924.jpg" alt="\">
集合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
下篇博文,再詳細介紹左右連接、內連接之間的區別和聯系。