废话不说,直接来个例子:
select * from A a left join B b on a.id=b.id
select * from A a , B b where a.id=b.id这两个sql语句的返回结果一样吗?效率哪个更好?
select * from A a left join B b on a.id=b.id
select * from A a , B b where a.id=b.id这两个sql语句的返回结果一样吗?效率哪个更好?
解决方案 »
- oracle 给定年份,查出每月有多少条数据
- 求救使用pl/sql在oracle9i和oracle7.3 database link
- DataStage建server job报错
- sqlserver表导入oracle时的问题?
- Oracle有没有类似mssql的企业管理器的东东啊
- 如何從ORACLE中導出表中的數據到ACCESS?(在線等待)
- 困扰我一个月的问题仍旧没有解决,哪位给我解决绝对给800分,君子一言驷马难追!!!拜托
- 急,急,急,高分相送,创建表的问题???
- 存储过程中的游标问题!急!
- 我在oracle里用sql*plus编译sql语句怎么不能见表呢
- 非常紧急--oracle9i drop表的回沪
- Linux oracle监听器问题(急)
--dept通过deptno左连接emp 显示dept表中的所有deptno,即使emp表中没有的deptno
SQL> select empno,ename,dept.dept
2 from dept left join emp
3 on emp.deptno=dept.deptno; EMPNO ENAME DEPTNO
---------- ---------- ----------
7782 CLARK 10
7839 KING 10
7934 MILLER 10
7369 SMITH 20
7566 JONES 20
7788 SCOTT 20
7876 ADAMS 20
7902 FORD 20
7499 ALLEN 30
7521 WARD 30
7654 MARTIN 30 EMPNO ENAME DEPTNO
---------- ---------- ----------
7698 BLAKE 30
7844 TURNER 30
7900 JAMES 30
40
50
60
70
--内连接 显示dept和emp同时存在的deptno
SQL> select empno,ename,dept.deptn
2 from emp,dept
3 where dept.deptno=emp.deptno
4 / EMPNO ENAME DEPTNO
---------- ---------- ----------
7782 CLARK 10
7839 KING 10
7934 MILLER 10
7369 SMITH 20
7566 JONES 20
7788 SCOTT 20
7876 ADAMS 20
7902 FORD 20
7499 ALLEN 30
7521 WARD 30
7654 MARTIN 30 EMPNO ENAME DEPTNO
---------- ---------- ----------
7698 BLAKE 30
7844 TURNER 30
7900 JAMES 30
等价于
SQL codeselect * from A a , B b where a.id=b.id(+)
我这没大量数据,所以也没法分析。
一个是左连接 ,一个是普通的表连接,根本就不能比第一个的记录要AU(A∩B) 第二个是A∩B 自己去看吧select * from A a left join B b on a.id=b.id
=
select * from A a , B b where a.id=b.id(+)
select * from a inner join b on a.id=b.id ---这两个哪个好? 简单的说,前者是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等等在各主流数据库的新版本中都陆续实现了
Oracle 表连接方式(内连接/外连接/自连接) 详解
http://blog.csdn.net/tianlesoftware/archive/2010/08/08/5795896.aspx------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
DBA1 群:62697716(满); DBA2 群:62697977(满)
DBA3 群:63306533; 聊天 群:40132017
--加群需要在备注说明SGA的组成部分,否则拒绝申请
就是A有的信息而B没有的信息也join进去