多表SQL關聯,相信大家都會寫,但是它背後的原理,你可能並不知道,今天我們來拆解一下多表SQL關聯,如果你已經明白什麼是笛卡爾積,那麼可以略過了。
什麼是笛卡爾積?
笛卡爾積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員。
笛卡爾積又叫笛卡爾乘積,是一個叫笛卡爾的人提出來的。 簡單的說就是兩個集合相乘的結果。
假設集合A={a, b},集合B={0, 1, 2},則兩個集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
看了概念,你可能無法真正理解它,因為太抽象,我們來形象化一下,看看什麼是集合A「班級表」與集合B「學生表」的乘積:
兩個集合相乘以後,班級表的數據被複製了5倍,學生表的數據被複製了3倍,兩個集合的數據被重複複製,如下圖所示就是集合A與集合B的笛卡爾乘積。
2表SQL關聯
我們將select* from [Class] c,[Student] s where c.ClassID=s.StudentClassID語句進行分步解讀。
1.首先先將班級表和學生表進行笛卡爾乘積,兩個表的數據都被重複複製,生成如下臨時表。
2.然後通過where後面的限制條件,只選擇那些StudentClassID和ClassID相等的行(上圖中劃了綠色的部分),最終得到選擇後的表的子集。
當然,where後面的限制條件不僅僅是等號,還可以使用比較運算符,包括了>(大於)、>=(大於或等於)、<=(小於或等於)、<(小於)、!>(不大於)、!<(不小於)和<>(不等於)。當然,限制條件所涉及的兩個列的數據類型必須匹配。
2+表SQL關聯
其實,你想明白了就很簡單,3張表關聯可以分解為2個兩兩關係,也就是兩兩齣結果以後,再去關聯第3張表。3張以上也是這個邏輯,複雜的問題拆解以後就會變得簡單。
最後的話
關聯使用的就是笛卡爾乘積的理論成果,但是每個資料庫廠商的實現會有所不同,多表關聯下表之間的位置關係,可能會影響到SQL的執行效率,這個要具體到不同的資料庫產品進行具體分析。