注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 可扩展、高可用、负载均衡..
 帮助

Oracle SQL开发学习笔记


2006-11-02 08:46:36
 标签:Oracle SQL 学习笔记   [推送到技术圈]

Oracle SQL开发学习笔记
 
作者:leizhimin
日期:2006-11-2
 
一、内连接(inner join)
 内连接通过where语句的连接条件先把所有要连接的表一个个的拼接成一个“大表”,如果中间有别的条件限制,可以通过限制条件,缩减表的列数和行数后,继续和别的表连接。连接的最后,是一些查询条件,用来限制这个“大表”的行数。 如果连接中,有任何一个表不匹配连接条件,那么该行数据将不会出现在“大表”中。
 例子:
 --老语法
 select b.mc, a.zxyy_mc
 from dm_zxyy a, dj_ztzx b
 where b.yy_dm = a.zxyy_dm
 --sql-92标准
 select b.mc, a.zxyy_mc
 from dm_zxyy a inner join dj_ztzx b
 on a.zxyy_dm=b.yy_dm
 以上两个sql的功能相同,sql标准的语法有所不同.
二、外连接(out join)
 外连接的类型有三种:左外连接、右外连接、全外连接,内连接可以删除原表中的一些行,外连接可以保留这些行中的一部分。
 (一)、左外连接
  1、连接条件写在where子句中。括号中的加法符号(+)写在连接条件的右边。这就指定了一个作外连接。连接条件中有多个子句时,加法符号必须写在每个子句的右边。‘+’相当于一个给右边表一个万能行,来匹配左边的表进行‘内连接’。
  例子:
  --老语法
  select a.*, b.*
   from tab1 a, tab2 b
  where a.sn = b.sn(+)
     a.tx > b.tx(+)
   order by a.sn
  
  --SQL92标准
  select a.*, b.*
   from tab1 a left outer join tab2 b
  on a.sn = b.sn(+)
     a.tx > b.tx(+)
   order by a.sn
  以上两个sql的功能相同,sql标准的语法有所不同.
 (二)、右外连接
  与左外连接相似,不做介绍。
 (三)、全外连接
  1、全外连接实际上是对两个分别进行左右连接后,再将结果集联合到一块形成的。
  2、进行联合的两个结果集的列必须相同。
  3、全外连接的语法:
   左外连接
    union
   右外连接
  4、union只能有一个order by子句,并且它必须位于union的最后一行中。这个子句按指定顺序对union所有行进行排序。
  5、union联合时,会删除重复的行,而不论重复的行是否来自同一个表。
  
三、union与union all
 (一)、union与连接的区别
  1、union将两个表的行合并到一个表中,并不对这些行做任何更改,并删除重复的行,而不论这些重复行是否来自同一个表。
  例子:
  --union联合查询
  select a1,b1,c1
   from tab1
  union
  select a2,b2,c2
   from tab2
  --连接查询
  select t1.*,t2.*
   from tab1 t1,tab2 t2
  where a.id=b.id
 (二)、union与union all的区别
  1、与union非常相似,唯一的区别是union all不删除重复的行,也不对行进行自动排序。
  2、union all比union省计算资源,应尽量使用union all。
 



 下一篇 CVS命令深入研究



    文章评论
 
2007-01-29 18:16:40
lz,全连接不是那意思的,你不要误导
select a.*,b.*
from a full outer join
b
on a.column=b.column

2007-01-30 01:44:45
哥们,我没有误导你!
看了你的评论后,我又专门做了一个测试,测试用到了两个表。都是我现做项目中的代码表。我所写的sql如下:

这个是全外连接的标准写法:也是你给出的
-------------------
select a.hyml_dm, b.hy_dm
from dm_hyml a
full outer join dm_hy b
on a.hyml_mc = b.hy_dm

下面这个写法是我文中提到的写法:
-------------------
select a.hyml_dm, b.hy_dm
from dm_hyml a, dm_hy b
where a.hyml_mc (+) = b.hy_dm
union
select a.hyml_dm, b.hy_dm
from dm_hyml a, dm_hy b
where a.hyml_mc = b.hy_dm (+)

这两个sql查询完成了同样一个功能,查询的结果完全相同。
我不知道你说我写错了之前,有没有做个测试。如果你没有测试过,我建议你照着我上面这两个sql,做个测试!如果你已经做过测试确实能证明我的是错误的,我将虚心请教你能把你测试的sql贴出来!

最后非常感谢你的评论,我又重温一次全外连接查询。最后也欢迎各位网友能在我的blog上多发评论!



2007-01-30 01:46:38
忘记说了,我的环境是Oracle10g 10.2.01 ,sql编辑器用的是PL/SQL 7.0,系统是windows server 2003 stand edition


2007-01-30 02:00:30
to sqler 哥们,为了测试的客观性,我导出了我测试用的表和数据,还有我写的测试sql。在附件里面,欢迎查看!

另外说明一点,读者可以用任意两个表来做测试。

2007-04-07 23:12:08
兄弟,是你错了,你把全外联接和联合搞混了,全外联接的关键字是full join....on...,它并不要求两个表的列必须相同。联合的关键字才是union,而联合则必须要求两个表的列相同,联合实际上就是把一个表的数据加到另一个表的数据后面。还是谢谢你的贴子,需要讨论请发:tang.qingguo@sz-excel.com

2007-04-09 08:13:00
联合和连接是两回事,全外连接的在Oracle中有两种写法,一种是:

左外连接
  union
  右外连接

一种是:
full outer join 。。。on。。。

把第一种方式鱼目混珠的看作是联合(union)是错误的,是两个外连接的联合!是否正确,你看看我发的第二个评论中的例子。实际操作一下,事实胜于雄辩。

2007-04-09 08:43:15
最后我希望以后各位要提左外、右外、全外链接的时候,尤其是全外链接,你先不要管标准的以前你怎么写,怎么认为。本文就是这么干的,并且的是正确的! 你要认为是错误的,就给出个例子出来,我就服你,否则我以后不再对此问题做出回答。

另外,你可以看看第二篇评论,这个是例子,验证了Oracle中全外链接的两种写法。

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: