sql的join分類問題
現在我們來談談sql的join 和 cross join 的區別
- 為何使用join:
表1:關於電影的名字和出品年份
MovieID |
MovieName |
YearMade |
1 |
My Fair Lady |
1964 |
2 |
Unforgiven |
1992 |
3 |
Time Machine |
1997 |
表2:關於電影演員的名字
MovieID |
FirstName |
LastName |
1 |
Rex |
Harrison |
1 |
Audrey |
Hepburn |
2 |
Clint |
Eastwood |
5 |
Humphrey |
Bogart |
正如上面兩個表所表示的,雖然兩個表裡面有相同的電影但是他們的資訊是分在兩個表格裡面的,那麼我們要是想整合這個兩個表的公共資訊怎麼辦呢?我們就可以使用Join來整合。
執行如下的語句:
Select a.moviename, a. yearmade, b.firstname, b.lastname from table1 a join table2 b
On a.MoiveID = b.MovieID
結果如下:
MovieID |
MovieName |
FirstName |
LastName |
1 |
My Fair Lady |
Rex |
Harrison |
1 |
My Fair Lady |
Audrey |
Hepburn |
2 |
Unforgiven |
Clint |
Eastwood |
我們就基於MovieID成功地整合了這兩個表格。
- 關於join的分類:
那既然我們直接使用join就可以實現了整合,那麼我們為什麼還要有inner join, left outer join, right outer join, full outer join, cross join呢?
- 關於inner和outer
依舊考慮上面的表1和表2join的情況,如果Join前面沒有加修飾符那麼預設為inner join可以看到我們所有的執行結果都是嚴格的按照on的條件輸出的,換句話說也就是每個記錄都是符合on的限制的,所以這就叫inner,我把它理解為在規則之內的意思。
那麼outer相對就是規則之外的意思。什麼叫規則之外呢?根據上面的意思就是不符合on。
看一個例子:
Select a.moviename, a. yearmade, b.firstname, b.lastname from table1 a left outer join table2 b
On a.MoiveID = b.MovieID
結果如下:
MovieID |
MovieName |
FirstName |
LastName |
1 |
My Fair Lady |
Rex |
Harrison |
1 |
My Fair Lady |
Audrey |
Hepburn |
2 |
Unforgiven |
Clint |
Eastwood |
3 |
Time Machine |
NULL |
NULL |
我們會發現執行結果多了一行,很明顯movie ID 為3的情況只存在於表1而不存在於表2,但是它卻顯示出來了,完全不符合on,而由於另外一個表格沒有對應的記錄,所以就都是NULL, 這就是outer的作用——完全顯示一個表格的資訊。
- 關於left和right 以及full
那麼我們為什麼有這三個詞之分呢?首先我們知到join在左邊和右邊都有一個table那麼問題就來了,到底是讓左邊的那個表的結果在on的限制之外呢還是右邊的那個表格呢,亦或是所有呢?所以我們用Left表示join左邊的那個表而right表示Join右邊的,full表示左右都有。
Right join結果如下:
MovieID |
MovieName |
FirstName |
LastName |
1 |
My Fair Lady |
Rex |
Harrison |
1 |
My Fair Lady |
Audrey |
Hepburn |
2 |
Unforgiven |
Clint |
Eastwood |
5 |
NULL |
Humphrey |
Bogart |
Full join結果如下:
MovieID |
MovieName |
FirstName |
LastName |
1 |
My Fair Lady |
Rex |
Harrison |
1 |
My Fair Lady |
Audrey |
Hepburn |
2 |
Unforgiven |
Clint |
Eastwood |
3 |
Time Machine |
NULL |
NULL |
5 |
NULL |
Humphrey |
Bogart |
- Cross join又是什麼鬼?!
我看到網上有人說是笛卡爾乘積,實際上就是把兩個表乘起來。最終的表的行數是表1的行數×表2的行數,作用在於考慮所有的組合情況,比如說電腦不同的元件的價格是不同的,我們可以把相同的元件做成一個表格,然後把不同元件的表格乘起來就能得到所有的配置方案和對應價格。
看下面這個例子:
表1
CompID |
CompDescription |
Price |
1 |
Pentium 3 GHtz, 1 GB RAM, nVdia G Force |
2000 |
2 |
Pentium 4 2.6 GHtz, 512 MB RAM, Intel 911 |
600 |
表2
AddOnID |
AddOnDescriptioon |
Price |
1 |
Creative Speakers, Joystick, LCD Screen |
200 |
2 |
Sony Speakers, LCD Screen |
160 |
3 |
LCD Screen, Wireless mouse |
120 |
執行:
Select A.CompDescription, B.AddOnDescription, A.Price + B.Price as ‘total cost’ from table1 A cross join table2 B
圖解:
結果
CompDescription |
AddOnDescriptioon |
total cost |
Pentium 3 GHtz, 1 GB RAM, nVdia G Force |
Creative Speakers, Joystick, LCD Screen |
2200 |
Pentium 3 GHtz, 1 GB RAM, nVdia G Force |
Sony Speakers, LCD Screen |
2160 |
Pentium 3 GHtz, 1 GB RAM, nVdia G Force |
LCD Screen, Wireless mouse |
2120 |
Pentium 4 2.6 GHtz, 512 MB RAM, Intel 911 |
Creative Speakers, Joystick, LCD Screen |
800 |
Pentium 4 2.6 GHtz, 512 MB RAM, Intel 911 |
Sony Speakers, LCD Screen |
760 |
Pentium 4 2.6 GHtz, 512 MB RAM, Intel 911 |
LCD Screen, Wireless mouse |
720 |