时间:2021-07-01 10:21:17 帮助过:69人阅读
刚刚在用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