好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

关于MySql和SqlServer中leftjoin,fulljoin的一点区别

题目简化后是这样的:

3张表 st, rk, ck,

st(id int)

id 1 2 3 4 5

rk(id int fk st.id, rk int)

id rk 1 4 2 5 3 6

ck(id int fk st.id, ck int)

id ck 2 3 3 4 4 1

现在要求用一条select实现这样的 输出效果

id rk ck 1 4 0 2 5 3 3 6 4 4 0 1

由于我用的MySql的编辑器不是很方便,所以想干脆先在SqlServer里面模拟一下看看。

利用full join,很快实现了我想要的结果,语句如下

select isnull(rk.id,ck.id) id,isnull(rk,0) rk,isnull(ck,0) ck
from rk
full join ck
on rk.id = ck.id

然后把语句放到MySql里,问题就来了,直接报错,提示是full join出错,没有这样的语法。

我怀疑是不是MySql不支持full join,然后到google上看了一下,看到不少都是直接用的full join做的,即

select ifnull(rk.id,ck.id) id,ifnull(rk,0) rk,ifnull(ck,0) ck
from rk
full join ck
on rk.id = ck.id

这里MySql的ifnull函数等同于SqlServer的isnull函数,即如果arg1为null,返回arg2,否则返回arg1。

但是我怎么调都不对。

到官网上看了下,一是也没找到详细说明。后来在一篇文章中看到,原来5.1+的版本才有full join。OMG~~~~~~

之前基本都是用left join ,right join组合来模拟。

看到这里我也想开了,撞到墙后不是回头,而是跨过去。

利用了left 再left,实现了上面的效果:

select st.id,ifnull(rk.rk,0) as rk,ifnull(ck.ck,0) as ck
from st
left join rk on (st.id = rk.id)
left join ck on (st.id = ck.id)
where rk != 0 or ck != 0

当然,也可以仿照上面文章的方法,利用left union right

select * from rk
left join ck on rk.id = ck.id
union
select * from rk
right join ck on rk.id = ck.id

好像更容易理解一点,也更通用。估计SqlServer内部也就是这样实现的。full join 是sql92标准。

还有一点区别:

MySql支持这样的join语法,SqlServer不支持

select *
from st
left join (ck,rk)
on (rk.id = st.id and ck.id = st.id)

结果是这样

id rk ck 1 2 5 3 3 4 6 4 5

可以看出,并不是我上面想要的。具体这个语法是什么没有细究,感觉应该是join括号里面的先做连接。

或者说left join(A, B)是一个"join 与"的写法,而left join A XXXXXX left join B XXXXXX 是"join 或"。

估计前者不是sql92。

MySql,full join,left join

查看更多关于关于MySql和SqlServer中leftjoin,fulljoin的一点区别的详细内容...

  阅读:40次