1. 程式人生 > >sql的join分類問題

sql的join分類問題

現在我們來談談sql的join 和 cross join 的區別

  1. 為何使用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成功地整合了這兩個表格。

 

  1. 關於join的分類:

那既然我們直接使用join就可以實現了整合,那麼我們為什麼還要有inner join, left outer join, right outer join, full outer join, cross join呢?

 

  1. 關於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的作用——完全顯示一個表格的資訊。

 

  1. 關於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

 

 

  1. 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