读书人

从两种SQL表连接写法来了解过去,该如何

发布时间: 2012-01-21 21:31:43 作者: rapoo

从两种SQL表连接写法来了解过去
由朋友提出此类问题
http://topic.csdn.net/u/20090806/09/cd21b02c-e321-46d7-924a-82fd442b0a41.html

select * from a,b where a.id=b.id
select * from a inner join b on a.id=b.id

---这两个哪个好?

其中11楼的回答最为深入。其实这个问题还是有一定的历史原因的,不管你习惯什么样的写法只要知道来龙去脉就不会再被细枝末节来迷惑了。以下观点为个人认识,如有偏差欢迎指正。

简单的说,前者是ansi sql 86标准后者是ansi sql 92标准(*****),这个观点最容易被人接受。

什么是ansi?美国国家标准局,iso的重要成员之一,1918年就有了。
什么是ansi sql?就是ansi注意到了sql的生产力,于是规范化了一下。

什么是sql?他是ibm发明的,oracle发扬广大的一门语言。

为什么是两家公司?。
70年代初因为ibm内部各方利益斗争激烈,导致某大牛的研究成果只能以论文方式发表。
70年代末某小公司把此技术用在商业领域就成了oracle,直到n年后ibm db2才出来。

所以,sql不是ansi 发明的,ansi 标准也不能通吃所有数据库平台。

比如下面这个是什么数据库的语法?反正ansi 标准在他那里是报错的。
select * from (a inner join b on a.id=b.id) inner join c on a.id=c.id

那么在ansi86之前的数据库有哪些?oracle和db2是肯定的了。另外还有一些当时的小角色:Informix,dbase系列等。

而sybase的数据库和SQLServer是86年之后出来的,而前面那个奇怪的join语法的access是90后的。

古老的sqlserver和oracle我都没有用过,反正在02年用oracle8i时还不支持ansi 92的inner join,他是97年生的。一直到本世纪发布的oacle9i 才改了过来。用多了t-sql的人会问 left join咋办,where a.id=b.id(+) 就可以了,人家没那么笨的,t-sql以前还有*=这样的表示。


那么这么看貌似ansi的规范力度不够?其实不是,国际标准化也不可能一刀切,在ansi92 当中定义了4个级别,n多条款。大意就是大家符合入门级就行了,其他高级别仅供参考,甚至iso根本不会验证其他级别..而诸如inner join和left join之类的都是过渡级的,。


所以我前面打了5个星星的那句话并不是完全正确的,正确的应该是

前者符合ansi 86 标准和ansi 92入门级标准,后者符合ansi92 过渡级标准。

不是oracle8i不符合ansi92,而是没有符合ansi92的高级别规范,而完全实现高级别标准的数据库系统是没有的。

早在oracle7就已经完全符合ansi92了,当然是指入门级,而且他就是ansi92 的模版范例。

--回到上面的话题,这两个哪个好?
性能当然完全一样,区别只是习惯和喜好,但也因为标准级别不同而具有不同的风险。

如果想要优雅而易于维护且不容易写错的代码,当然用高标准的第二种方法。
如果必要考虑风险这个因素,比如涉及到多种平台的迁移或者整合,你应该用第一种,起码在两个表的情况下他还是比较安全的。

----
顺带提一句,ansi标准一直在修订:具体有多少版本就不列举了,我们得到的好处自然是多多的,比如递归、对象、数组、xml等等在各主流数据库的新版本中都陆续实现了

[解决办法]
bd
[解决办法]
BD
[解决办法]
我是希望sql标准能加入:

SQL code
select top n offset m * from ... where ... order by ...
[解决办法]
每个人都会穿不同的衣服,但有TMD公司就是要你上班穿西服打领带!!!
为了什么,标准和规范!

[解决办法]
东西当然要弄个不一样的出来,才显得自己有面子呀,呵呵,学习一下
[解决办法]
呵呵学习
[解决办法]
学习
[解决办法]
.
[解决办法]
剪刀哥太崇拜你了,学习了
[解决办法]
详细分解了。。。。
支持

[解决办法]
学习了....
[解决办法]
一个问题引发的思考,
学习了。。。
[解决办法]
看完了
[解决办法]
学习
[解决办法]
学习!
[解决办法]
学习!
[解决办法]
学习
[解决办法]
受益很多
------解决方案--------------------


很好的文章,谢谢
[解决办法]
学习
[解决办法]
牛。
[解决办法]
俺是进来学习的
[解决办法]
。。
[解决办法]
分析的有道理。多注重细节,还有为什么这样而不能那样,还有就是多解决方法的区别
[解决办法]
看完了,没看懂
[解决办法]
学习了

[解决办法]
学习 讲得真好
[解决办法]
支持!
[解决办法]
多谢楼主分享。。。
[解决办法]

[解决办法]
学习学习
[解决办法]
学习学习
[解决办法]
dddddd
[解决办法]
这么详细,学习了……
[解决办法]
学习

Informix当年不算小角色吧
[解决办法]
貌似现在比较习惯86版的
[解决办法]
学习下

[解决办法]
学习。。
[解决办法]
细致、透彻
[解决办法]
前一个是SQL的标准,在其他数据库中也可以执行。后一个是T_SQL92的标准,在SQL SERVER中执行。
[解决办法]
嗯..
知道了...
[解决办法]
好贴留名~~~
[解决办法]
学习了
[解决办法]
.
[解决办法]
mark~
[解决办法]
虽然看了好几次,但是还有点看不明白
[解决办法]
学习
[解决办法]
mark
[解决办法]
D
[解决办法]
原来如此...
[解决办法]
我也是90后的,哈哈,Informix当年不小
[解决办法]
ding bu
[解决办法]
受教了 谢谢
------解决方案--------------------


不错,厉害
[解决办法]
up
[解决办法]
还是习惯用where进行关联
[解决办法]
学习了。
[解决办法]
学习了....
[解决办法]
不会,学学。
[解决办法]
实际项目中经常会多个表连接,
此时join+on具有更好的可读性,
各表的连接关系非常清晰。

至于通用性,
这种表连接的转换所占的工作量份额是不多的,也很简单。
为了极小可能性的未来数据库移植而采用全where的形式,
窃为不取也。
[解决办法]
有些复杂
[解决办法]
mark
我大学时一直用
select * from a,b where a.id=b.id
从工作开始才用
select * from a inner join b on a.id=b.id


[解决办法]
楼主你给我上了一堂课
[解决办法]
呵呵,讨论滴很详细!
[解决办法]
太有才了!
[解决办法]
学习。。。谢谢
[解决办法]
..
[解决办法]
学习,学习
[解决办法]
不错不错!值得学习。
[解决办法]
select * from a,b where a.id=b.id
select * from a inner join b on a.id=b.id
两者区别在于 id字段显示次数等问题
我通常用后者,简洁!

还有
select * from (a inner join b on a.id=b.id) inner join c on a.id=c.id
与select * from a (inner join b on a.id=b.id) inner join c on a.id=c.id
[解决办法]
很好,很强大啊~
解决了我心中已久的问题!
[解决办法]
原来
[解决办法]
JINGDIAN!
[解决办法]
学习,up!
[解决办法]
强者注重细节...up
[解决办法]
学习了。。。
[解决办法]
learning
[解决办法]
jf
[解决办法]
关注...
[解决办法]
学习了
[解决办法]
ding
[解决办法]
原来如此深奥。。。我现在正在看GB18030-2005标准。。。。
[解决办法]
谢谢楼主,你老霸到了!
------解决方案--------------------


关注
[解决办法]
严重学习了
[解决办法]
看君一帖,枉读大学。
[解决办法]
jf
[解决办法]
多谢楼主分享。。。
[解决办法]
dingding
[解决办法]
这么说的话 那我们现在用的sql(也就是oracle10g里用的那种)
select a.e , b.r From a,b where a.e = b.r 这种写法还是较为古老的咯?
难怪是甲骨文10g...
[解决办法]
关注,学习~
[解决办法]
我比较喜欢用 a.b = b.c

但是听说inner比较高效,所以还是用inner
[解决办法]

探讨
呵呵学习

读书人网 >SQL Server

热点推荐