Oracle中各种连接与加号(+)的使用

文章介绍了数据库查询中的JOIN操作,包括左外连接(LEFTJOIN)以左表记录为基础,右外连接(RIGHTJOIN)以右表为基础,全连接(FULLJOIN)显示所有记录,等值查询只显示匹配项,内联接查询(INNERJOIN)效率较高,以及交叉查询(CROSSJOIN)产生笛卡尔积的结果。每个JOIN类型都配合使用了(+)(WHERE)或ON关键字来说明其工作原理。

1、左外连接(Left outer join/ left join)

        left join 是以左表的记录为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

        用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。例子:

select a.*,b.bname from student_drb a, class_drb b where a.bno=b.bno(+);//注意:用(+) 就要用关键字where

2、右外连接(right outer join/ right join)

        和左连接的结果刚好相反,是以右表为基础的, 显示右表的所有记录,在加上左表和右表匹配的结果。 左表不足的地方用NULL填充。

        用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。例子:

select a.*,b.bname from student_drb a, class_drb b where a.bno(+)=b.bno;//注意: 用(+) 就要用关键字where

 3、全连接(full join)

        左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。

4、等值查询

select a.*,b.bname from student_drb a, class_drb b where a.bno=b.bno

        查询出的结果是左表和右表中bno字段相等的显示出来。也即出来的结果肯定比左、右、全连接的结果要少或相等。

5、内联接查询 inner join  on(与等值查询结果是一样的),

        效率要比等值查询高,因为等值查询是先笛卡尔积,再根据条件查找。

6、交叉查询 cross join (如果需要条件则用where而不用on)

        交叉查询是用的笛卡尔积,效率较慢

select * from student_drb cross join class_drb

等价于:select * from student_drb,class_drb

当我们在Oracle SQL中提到“连接条件有变动添加加号”,通常是指早期版本的Oracle(如9i、10g等)使用的外连接语法,其中使用加号(`+`)来表示外连接操作。这是在ANSI标准SQL `LEFT JOIN`、`RIGHT JOIN` 和 `FULL OUTER JOIN` 语法流行之前的一种特定于Oracle的方式。 ### Oracle 连接中的加号 #### 内连接 (INNER JOIN) 内连接是最常见的连接类型,默认返回两个表中共有的记录部分,并不需要特别的操作符: ```sql SELECT a.column_name, b.column_name FROM table_a a, table_b b WHERE a.common_column = b.common_column; ``` #### 左向外连接 (LEFT OUTER JOIN) 如果想要保留左表的所有行,在找不到匹配项的情况下允许右表的结果为空,则可以在右边的列上加上 `(+)` 符号: ```sql SELECT a.column_name, b.column_name FROM table_a a, table_b b WHERE a.common_column = b.common_column(+); ``` 这相当于现代的 ANSI 标准写法: ```sql SELECT a.column_name, b.column_name FROM table_a a LEFT OUTER JOIN table_b b ON a.common_column = b.common_column; ``` #### 右向外连接 (RIGHT OUTER JOIN) 同样地,如果你希望保证右侧表格的数据完整显示出来而左侧可以为空值的话,则需要给左边字段名后边追加一个`(+)`. ```sql SELECT a.column_name, b.column_name FROM table_a a, table_b b WHERE a.common_column(+) = b.common_column ; ``` 注意这里的差别在于我们将 `(+)` 放到了等于运算符的左侧而不是右侧. 这种形式实际上是在模拟现在更为普遍接受的标准SQL RIGHT JOIN语句: ```sql SELECT a.column_name, b.column_name FROM table_a a RIGHT OUTER JOIN table_b b ON a.common_column = b.common_column; ``` #### 完全外部联结(FULL OUTER JOIN) 对于完全外部联合查询来说,即想获取两方所有数据并把对方不存在的部分补NULL, 则需要同时对两边都采用上述方式处理; 然而在实际应用中我们更推荐直接改用ANSI标准的形式来做此需求. 需要注意的是从更高版本开始oracle建议开发者们更多地依赖标准化join关键字而非旧式符号表达方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值