Oracle中的外连接(一)

本文详细介绍了Oracle数据库中的连接查询方式,包括内连接、外连接、交叉连接和自然连接,并对比了ANSI SQL标准语法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:昨天被Oracle中的外连接搞得头晕乎乎的, 弄了一晚上,到今天下午问了一下同学才搞清楚~

多表连接查询

Oracle数据库中特有的连接语法如下:

SELECT TABLE1.COLUMN, TABLE2.COLUMN
          FROM TABLE1, TABLE2
         WHERE TABLE1.COLUMN1 = TABLE2.COLUMN2;

   

1.1 内连接

我们经常使用

例如:针对我做的程序,查询某个系的安排毕业设计答辩场地信息

SJ_GD_TEACHERS存放某个系的所有的毕业设计指导教师,SJ_GD_REPLY表存放对一些教师的答辩安排

SELECT A.FTEACHERID, A.FTEACHERNAME, B.FPLACE, B.FSTARTTIME, B.FENDTIME
  FROM SJ_GD_TEACHERS A, SJ_GD_REPLY B
 WHERE A.FTEACHERID = B.FTEACHERID;
ANSI SQL的标准内连接语法是使用 INNER JOIN 连接左右的两个表,通过 ON 子句指定两个表的连接条件,WHERE 子句用来指定条件子句

SELECT TABEL1.COLUMN, TABLE2.COLUMN
  FROM TABLE1
 INNER JOIN TABLE2
    ON TABLE1.COLUMN1 = TABLE2.COLUMN2
 WHERE TABLE1.COLUMN2 = 'xxxx'

    

1.2 外连接

上面有一个问题,如果在A表中存在的FTEACHERID但在B表中该字段为NULL的记录,那么在使用内连接查询时,这些记录将不会出现在内连接列表中。这个时候我们就可以使用外连接语法来保留连接左边和右边的数据,例如那些在A表中存在但在B表中不存在的FTEACHERID记录也要显示。SQL提供了外连接来实现这种功能。外连接又分为两类,分别是用于保存左侧表内容的左外连接和保存右侧表内容的右连接。

--右外连接

SELECT TABLE1.COLUMN, TABLE2.COLUMN
  FROM TABLE1, TABLE2
 WHERE TABLE1.COLUMN1(+) = TABLE2.COLUM2N;
--左外连接


SELECT TABLE1.COLUMN, TABLE2.COLUMN
  FROM TABLE1, TABLE2
 WHERE TABLE1.COLUMN1 = TABLE2.COLUMN2(+);
注意:不能在左右两侧都放置(+)符号。

那么上述问题就可以改写成:

SELECT A.FTEACHERID, A.FTEACHERNAME, B.FPLACE, B.FSTARTTIME, B.FENDTIME
  FROM SJ_GD_TEACHERS A, SJ_GD_REPLY B
 WHERE A.FTEACHERID = B.FTEACHERID(+);
如果是使用ANSI SQL,则左连接、右连接及全连接语法如下所示:

SELECT TABLE1.COLUMN, TABLE2.COLUMN
  FROM TABLE1
  [LEFT |
 RIGHT |
  FULL OUTER JOIN TABLE2
    ON (TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME)];

在ANSI SQL中,FULL OUTER JOIN表示全连接,除了包含连接的数据之外,还包含连接的表中不符合连接条件的数据。(注:这个我暂时还没有用到)

1.3 交叉连接

交叉连接是指用A表中的记录行与B表中的记录行数相乘得到的笛卡尔积,如果在进行里连接查询时不指定任何连接条件,将产生交叉查询。比如TABLE1表中有15条记录,TABLE2表中有3条记录,使用交叉连接得到的结果就有15*3 = 45条记录。

对于ANSI SQL标准,可以使用CROSS JOIN 来实现交叉查询语法:

SELECT TABLE1.COLUMN, TABLE2.COLUMN
  FROM TABLE1
 CROSS JOIN TABLE2
 WHERE ......

不使用标准,直接:

SELECT TABLE1.COLUMN, TABLE2.COLUMN
  FROM TABLE1, TABLE2
 WHERE ......

即可。(注:这个我没有用过)

1.4 自然连接

如果两个表中有相同名字和数据类型的列,那么可以使用自然连接来自动匹配数据类型和列名。自然连接使用NATURAL JOIN关键字。

注意:自然连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,当数据类型不同,NATURAL JOIN语法会引起错误。

感觉:自然连接我目前没有使用过,不过我感觉类似于内连接,只不过比内连接有更为严格的要求!






转载于:https://my.oschina.net/eillenme/blog/100442

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值