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

猜你喜欢

转载自www.cnblogs.com/dreamworldclark/p/9903001.html