欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

关于MySql 和SqlServer 中left join , full join的一点区别

程序员文章站 2023-12-24 20:00:09
...

刚刚在用mysql写一个select语句,中间用到了一些连接方面的功能,发现这2者还是有不少区别的。 首先交代一下环境: OS:windows 2003 MySql:Server version 5.0.37 SqlServer:2000 + sp4 题目简化后是这样的: 3张表 st, rk, ck, st(id int) id 1 2 3 4

刚刚在用mysql写一个select语句,中间用到了一些连接方面的功能,发现这2者还是有不少区别的。

首先交代一下环境:

OS:windows 2003

MySql:Server version 5.0.37

SqlServer:2000 + sp4

题目简化后是这样的:

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

上一篇:

下一篇: