網(wǎng)摘自:https://www.bilibili.com/read/cv11976343 1.區(qū)分笛卡兒積,自然連接,等值連接,內(nèi)連接,外連接(左連接,右連接和全連接) 假設(shè)存在兩張表R和S,這里使用的是MySQL數(shù)據(jù)庫(kù)。 下面這張表是R 下面這張是S 為了測(cè)試左連接和右連接,現(xiàn)在增加一張表T,字段和S表的字段一樣,只是數(shù)據(jù)不一樣。 1)笛卡兒積 那么R和S的笛卡兒積 SQL語(yǔ)句如下: select * from R,S;或select * from R cross join S; 結(jié)果如下: 笛卡兒積cross join 象征著返回所有的情況。 2)自然連接 連接是由笛卡兒積和選擇操作組合而成,進(jìn)行連接操作的表必須要有相同的字段,否則進(jìn)行連接操作就沒(méi)有意義了。(這里并不是要求兩張表里都有相同名稱(chēng)的字段,而是要求兩個(gè)表單都有一個(gè)字段表達(dá)的是一個(gè)意思,如學(xué)生表S有一個(gè)S#字段,用來(lái)唯一標(biāo)識(shí)一個(gè)學(xué)生,而成績(jī)表SC里有一個(gè)字段SC#,它是用來(lái)標(biāo)識(shí)指定學(xué)生的成績(jī)的)?!眓atrual join 自然連接”的處理方式:先進(jìn)行笛卡兒積操作,然后重復(fù)的屬性只保留一份。如R和S進(jìn)行自然連接,R和S都存在屬性B,所以進(jìn)行自然連接后結(jié)果只包和屬性A,B,C。 自然連接的步驟是將第一張表的第一條記錄和第二張表的每一條記錄匹配,如果符合條件就組成一條記錄,然后第一張表的第二條記錄再和第二張表的每一條記錄匹配,這步驟一直循環(huán)到第一張表的最后一條記錄。 R和S的自然連接 SQL語(yǔ)句如下: select R.A,R.B,S.C from R,S where R.B = S.B;或select * from R natural join S; 結(jié)果如下: 3)等值連接 其實(shí)等值連接就是內(nèi)連接。 4)內(nèi)連接 “inner join 內(nèi)連接”的處理方式:雖然重復(fù),但兩份都保留。如R和S進(jìn)行內(nèi)連接,R和S都存在屬性B,進(jìn)行內(nèi)連接后結(jié)果包含屬性A,R.B,S.B,C。內(nèi)連接的結(jié)果和自然連接的結(jié)果是一樣的,只不過(guò)是顯示的屬性不一樣而已。內(nèi)連接會(huì)將兩張表的重復(fù)屬性都分別列出來(lái)。 R和S的內(nèi)連接 SQL語(yǔ)句如下: select * from R,S where R.B=S.B;或select * from R inner join S on R.B=S.B; 結(jié)果如下: 5)左連接 left join 是left outer join的簡(jiǎn)寫(xiě),它的全稱(chēng)是左外連接,是外連接中的一種。左(外)連接,左表的記錄將會(huì)全部表示出來(lái),而右表只會(huì)顯示符合搜索條件的記錄。右表記錄不足的地方均為NULL。其實(shí)就是將右邊的表的第一項(xiàng)根據(jù)條件分別和左邊的每一行數(shù)據(jù)進(jìn)行對(duì)比,如果符合條件,就拼成一條記錄。 SQL語(yǔ)句如下: select * from R left join S on R.B=S.B; 結(jié)果如下: 這個(gè)或許不太能體現(xiàn),下面再看一下表R和T的左連接結(jié)果, SQL語(yǔ)句如下: select * from R left join T on R.B=T.B; 條件不想等就補(bǔ)null。 結(jié)果如下: 6)右連接 right join是right outer join的簡(jiǎn)寫(xiě),它的全稱(chēng)是右外連接,是外連接中的一種。與左(外)連接相反,右(外)連接,左表只會(huì)顯示符合搜索條件的記錄,而右表的記錄將會(huì)全部表示出來(lái)。左表記錄不足的地方均為NULL。 右連接的匹配步驟是先將左邊的表的第一項(xiàng)根據(jù)條件分別和右邊的每一行數(shù)據(jù)進(jìn)行對(duì)比,如果符合條件,就拼成一條記錄。 SQL語(yǔ)句如下: select * from R right join S on R.B=S.B; 結(jié)果如下: 下面再看一下表R和T的右連接結(jié)果, SQL語(yǔ)句如下: select * from R right join T on R.B=T.B; 結(jié)果如下: 7)全連接 全連接也是屬于外連接的一種。但是MySQL里沒(méi)有全連接的關(guān)鍵字。但是可以通過(guò)union來(lái)實(shí)現(xiàn)。 注意: UNION 內(nèi)部的每個(gè) SELECT 語(yǔ)句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類(lèi)型。同時(shí),每個(gè) SELECT 語(yǔ)句中的列的順序必須相同。 默認(rèn)地,UNION 操作符選取不同的值。如果允許重復(fù)的值,請(qǐng)使用 UNION ALL。 UNION 結(jié)果集中的列名總是等于 UNION 中第一個(gè) SELECT 語(yǔ)句中的列名。 下面看一下表R和T的右連接結(jié)果, SQL語(yǔ)句如下: (select * from R left join T on R.B=T.B) union (select * from R right join T on R.B=T.B); 結(jié)果如下: ![]() |
|
來(lái)自: 新用戶(hù)2585iHOb > 《Java》