现在我们来谈谈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 |