关于MySql 和SqlServer 中left join , full join的一点区别
Jun 07, 2016 pm 03:39 PM刚刚在用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

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Compétences de traitement de structures de données volumineuses de PHP

Comment optimiser les performances des requêtes MySQL en PHP ?

Comment utiliser la sauvegarde et la restauration MySQL en PHP ?

Comment insérer des données dans une table MySQL en utilisant PHP ?

Quels sont les scénarios d'application des types d'énumération Java dans les bases de données ?

Comment corriger les erreurs mysql_native_password non chargé sur MySQL 8.4

Comment utiliser les procédures stockées MySQL en PHP ?

Comment créer une table MySQL en utilisant PHP ?
