代码改变世界

简单题目,看看你是不是也会挂掉(关于left join)

2012-05-31 15:20  AceYue  阅读(4028)  评论(51编辑  收藏  举报

     也许你看到这篇文章觉得很基础,别忙着吐糟,仔细想想,说不定你也会载在这个上面。关于left join 你到底了解多少?无论你是资深的老鸟还是刚入行的菜鸟,都会有所收获。也许某天你去面试的时候会突然碰到这样的一道题,心里会有所失望,竟然考这么简单的题!ON , 你错了,仔细想想会发现,结果会是这样的吗?

     先来看看你对left join 了解多少把:这里定义了两张表,数据如下:

declare @order table(ID int,Name varchar(20))
declare @Detail table(ID int,Price float)

insert into @order(ID,Name) values(1,'aa'),(2,'bb'),(3,'cc')
insert into @Detail(ID,Price) values(1,10.5),(2,12.3),(4,5.9)

select * from @order
select * from @Detail

如果运行一下:left join 的联合查询 

select * from @order o left join @Detail d on o.ID=d.ID

都别急着看运行结果,猜猜看结果会是怎样的呢?

结果是会显示出四列:ID Name ID Price 而如果要显示三列就不能用 * 而需要明确的指定列名。

如果这个答案你是正确的,那么我们来看看下面的条件又会出现什么结果呢?

select * from @order o left join @Detail d on 1=1

这个猜测看,我觉得会难道一大批人。这个是我们最熟悉而又最容易摔到的地方,这个语句运行后结果会是记录呢?看看结果吧!

结果出来的时候我们才会恍然大悟。

别急,精彩继续,或许有一天你会被问到 left join 与 left outer join 有什么区别,到底会有什么区别呢?我们来分别执行下下面的语句:

select * from @order o left join @Detail d on o.ID=d.ID
select * from @order o left outer join @Detail d on o.ID=d.ID


select * from @order o left join @Detail d on 1=1
select * from @order o left outer join @Detail d on 1=1

结果如下:

      他们的结果并未区别,这时才恍然大悟,原来只是被面试官给坑了。Left join 只不过是left outer join 的缩写而已,我们习惯了left join时就不会去管left outer join,当某天被突然提及时又有所怀疑。其实高级程序员并非能写出多么高深的代码,而是能将基础深入骨髓,而非似乎是这样。

 

补充:


看到许多热心网友的评论,我在此补充一点:

关于cross join :笛卡尔积,就是得到多张表的乘积。

但是这里的 left join 与cross join 以及 inner join的结果会有什么区别呢?我们执行下面的语句来看看:

select * from @order o left join @Detail d on 1=1
select * from @order o inner join @Detail d on 1=1
select * from @order cross join @Detail

得到如下结果:

这里看以看出,这三种写法查询出的总行数是相同的,但是left join与inner join 及cross join执行的结果组合方式有差别,这说明他们匹配的规则是不相同的。

注意 在使用CROSS JOIN关键字交叉连接表时,因为生成的是两个表的笛卡尔积,因而不能使用ON关键字,只能在WHERE子句中定义搜索条件。

 

补充二:


      看到很多朋友的评价,对我很有帮助,网友的力量是强大,在此表示感谢!,在此特别要提出@laskfla 的建议,如果用两张表的nulll 列作为ON的条件会有什么结果呢?下面来看看吧:

 

declare @test table(ID int,description varchar(50))
declare @des table(ID int,Detail varchar(50))

insert into @test values(null,'aaaaaaaaa'),(null,'bbbbbbbbbbbb'),(null,'cccccccccc')
insert into @des values(null,'111'),(null,'222222'),(null,'3333333')

select * from @test
select * from @des

select * from @test t left join @des s on t.ID=s.ID
select * from @test t inner join @des s on t.ID =s.ID

 

执行之后会有什么结果呢?我们拭目以待:

    对于出这样的结果我们很容易理解,也会对多表连接认识的更加深刻。

    本文所讲的内容都是很基础的东西,我并不是想说明什么,而是要在这里提醒大家最容易忽略的东西,往往会让我们摔个跟头。所以如果你对多表连接有更深刻的认识,请留下您的宝贵意见,希望本文可以帮到部分和我一样奋斗中的程序员。