數(shù)據(jù)庫(kù)開(kāi)發(fā)應(yīng)知應(yīng)會(huì)之笛卡爾積
本文轉(zhuǎn)載自微信公眾號(hào)「活在信息時(shí)代」,作者活在信息時(shí)代。轉(zhuǎn)載本文請(qǐng)聯(lián)系活在信息時(shí)代公眾號(hào)。
很多數(shù)據(jù)庫(kù)開(kāi)發(fā)人員都聽(tīng)說(shuō)過(guò)笛卡爾積的概念,也可能偶爾碰上過(guò)因?yàn)镾QL語(yǔ)句或者數(shù)據(jù)表數(shù)據(jù)問(wèn)題而產(chǎn)生的笛卡爾積問(wèn)題。但是很多人對(duì)于笛卡爾積產(chǎn)生的原因和如何避免還是有些一知半解。所以我們今天就簡(jiǎn)單明了地給大家介紹一下什么情況下會(huì)產(chǎn)生笛卡爾積問(wèn)題,以及如何避免。
一、什么是笛卡爾積
笛卡爾積是指在數(shù)學(xué)中,兩個(gè)集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y,第一個(gè)對(duì)象是X的成員而第二個(gè)對(duì)象是Y的所有可能有序?qū)Φ钠渲幸粋€(gè)成員。
假設(shè)集合A={a, b}有兩個(gè)元素,集合B={0, 1, 2}有三個(gè)元素,則兩個(gè)集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}有2*3為6個(gè)元素。
在SQL查詢語(yǔ)句中,出現(xiàn)笛卡爾積的情況都是出現(xiàn)在關(guān)聯(lián)查詢上,具體包括下面兩種。我們以下面兩張表為例,給大家介紹一下。
第一張表是雇員表:有20條數(shù)據(jù),如下圖:
第二張表為工資表:也有二十條數(shù)據(jù),如下圖:
二、數(shù)據(jù)表關(guān)聯(lián)查詢時(shí),如果連接沒(méi)有ON條件,會(huì)出現(xiàn)全部笛卡爾積
對(duì)于以上的兩張表,如果我們查詢
結(jié)果為:
可以看出,一共出現(xiàn)了20*20=400條數(shù)據(jù)。即出現(xiàn)了全部笛卡爾積。
三、數(shù)據(jù)表關(guān)聯(lián)查詢時(shí),如果ON條件字段是非唯一字段,會(huì)出現(xiàn)部分笛卡爾積
以上面的數(shù)據(jù)為例,如果我們以ejob字段進(jìn)行連接的話,語(yǔ)句如下:
結(jié)果為:
可以看出,由于ejob不是唯一字段,最終出現(xiàn)了36條結(jié)果,也就是出現(xiàn)了部分笛卡爾積。
四、如何才能不出現(xiàn)笛卡爾積的查詢結(jié)果
為避免出現(xiàn)查詢結(jié)果為笛卡爾積的冗余數(shù)據(jù)情況,應(yīng)該在連接查詢時(shí),使用唯一字段進(jìn)行連接。