left join和直接连表的区别?

jwx0925 2010-09-14 01:09:51
废话不说,直接来个例子:
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语句的返回结果一样吗?

效率哪个更好?
...全文
1028 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
edensohws 2010-09-17
  • 打赏
  • 举报
回复
关注一下
Coffee-84 2010-09-17
  • 打赏
  • 举报
回复
select * from A a left join B b on a.id=b.id
就是A有的信息而B没有的信息也join进去
WXHDSWH 2010-09-17
  • 打赏
  • 举报
回复
再通俗点说就是右边存在的必须能在左边找到
WXHDSWH 2010-09-17
  • 打赏
  • 举报
回复
结果一般不一样啦,一个是左连接,一个是内连接,内连接需要左右完全相等,而左连接是左边可以有,右边必须有
xubangfei122 2010-09-17
  • 打赏
  • 举报
回复
一个是左联接,一个是内联接!怎么可能一样?
Dave 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 jwx0925 的回复:]
废话不说,直接来个例子:

SQL code
select * from A a left join B b on a.id=b.id


SQL code
select * from A a , B b where a.id=b.id


这两个sql语句的返回结果一样吗?

效率哪个更好?
[/Quote]


这2种SQL 返回的结果集是不一样的。 最简单的方法是建2张表,自己动手查询一下。

参考:
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的组成部分,否则拒绝申请
cqhweb 2010-09-14
  • 打赏
  • 举报
回复
select  * from a,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等等在各主流数据库的新版本中都陆续实现了
chaoyugang 2010-09-14
  • 打赏
  • 举报
回复
查询的结果就不一样撒
gelyon 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wkc168 的回复:]
引用楼主 jwx0925 的回复:
废话不说,直接来个例子:

SQL code
select * from A a left join B b on a.id=b.id


SQL code
select * from A a , B b where a.id=b.id


这两个sql语句的返回结果一样吗?

效率哪个更好?

回答是否定的
一个是左连接 ,一个……
[/Quote]

赞一个!
心中的彩虹 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 jwx0925 的回复:]
废话不说,直接来个例子:

SQL code
select * from A a left join B b on a.id=b.id


SQL code
select * from A a , B b where a.id=b.id


这两个sql语句的返回结果一样吗?

效率哪个更好?
[/Quote]
回答是否定的
一个是左连接 ,一个是普通的表连接,根本就不能比

第一个的记录要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(+)
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jwx0925 的回复:]
在A B 表很小的情况下,Oracle通过分析是不走索引的,是全表扫描。
我这没大量数据,所以也没法分析。
[/Quote]这两个查询语句的结果是不相同的,不是效率高低的问题
jwx0925 2010-09-14
  • 打赏
  • 举报
回复
在A B 表很小的情况下,Oracle通过分析是不走索引的,是全表扫描。
我这没大量数据,所以也没法分析。
cjh200102 2010-09-14
  • 打赏
  • 举报
回复
这个可以自己写代码计算下时间啊
minitoy 2010-09-14
  • 打赏
  • 举报
回复
select * from A a left join B b on a.id=b.id
等价于
SQL codeselect * from A a , B b where a.id=b.id(+)
  • 打赏
  • 举报
回复
--给你个例子
--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

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧