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