Oracle左右全连接总结

本文详细介绍了SQL中的各种连接类型,包括内连接、左连接、右连接、全外连接及交叉连接,并通过具体示例展示了每种连接的效果。此外,还特别提到了Oracle数据库中的特定语法。
--建立测试数据 create table a(id number); create table b(id number); insert into a values(1); insert into a values(2); insert into a values(3); insert into b values(1); insert into b values(2); insert into b values(4); commit; --左: --主流数据库通用的方法 select * from a left join b on a.id=b.id; --Oracle特有的方法 select * from a, b where a.id=b.id(+); ID ID ---------- ---------- 1 1 2 2 3 --右: --主流数据库通用的方法 select * from a right join b on a.id=b.id; --Oracle特有的方法 select * from a, b where a.id(+)=b.id; ID ID ---------- ---------- 1 1 2 2 4 --内 --主流数据库通用的方法 select * from a join b on a.id=b.id; --where关联 select * from a, b where a.id=b.id; ID ID ---------- ---------- 1 1 2 2 --全外 --主流数据库通用的方法 select * from a full join b on a.id=b.id; --Oracle特有的方法 select * from a, b where a.id = b.id(+) union select * from a, b where a.id(+) = b.id; ID ID ---------- ---------- 1 1 2 2 3 4 --完全,也叫交叉连接或者笛卡尔积 --主流数据库通用的方法 select * from a,b; --或者 select * from a cross join b; ID ID ---------- ---------- 1 1 1 2 1 4 2 1 2 2 2 4 3 1 3 2 3 4 连接无非是这几个 --内连接和where相同 inner join --左向外连接,返回左边表所有符合条件的 left join --右向外连接,返回右边表所有符合条件的 right join --完整外部连接,左向外连接和右向外连接的合集 full join --交叉连接,也称笛卡儿积。返回左表中的每一行与右表中所有行的组合 cross join --补充: --左向外连接,返回左边表所有符合条件的, --注意这里没有第二个加号,会直接过滤掉数据,只显示符合条件的记录 select * from a, b where a.id = b.id(+) and b.id = 2; ID ID ---------- ---------- 2 2 --左向外连接,返回左边表所有符合条件的 --注意where上第二个加号,它的作用是修改右边表记录的显示,例如如果b.id(+) = 2,显示为2,否则显示null select * from a, b where a.id = b.id(+) and b.id(+) = 2; ID ID ---------- ---------- 2 2 3 1 --建立测试数据 create table a(id number); create table b(id number); insert into a values(1); insert into a values(2); insert into a values(3); insert into b values(1); insert into b values(2); insert into b values(4); commit; --左: --主流数据库通用的方法 select * from a left join b on a.id=b.id; --Oracle特有的方法 select * from a, b where a.id=b.id(+); ID ID ---------- ---------- 1 1 2 2 3 --右: --主流数据库通用的方法 select * from a right join b on a.id=b.id; --Oracle特有的方法 select * from a, b where a.id(+)=b.id; ID ID ---------- ---------- 1 1 2 2 4 --内 --主流数据库通用的方法 select * from a join b on a.id=b.id; --where关联 select * from a, b where a.id=b.id; ID ID ---------- ---------- 1 1 2 2 --全外 --主流数据库通用的方法 select * from a full join b on a.id=b.id; --Oracle特有的方法 select * from a, b where a.id = b.id(+) union select * from a, b where a.id(+) = b.id; ID ID ---------- ---------- 1 1 2 2 3 4 --完全,也叫交叉连接或者笛卡尔积 --主流数据库通用的方法 select * from a,b; --或者 select * from a cross join b; ID ID ---------- ---------- 1 1 1 2 1 4 2 1 2 2 2 4 3 1 3 2 3 4 连接无非是这几个 --内连接和where相同 inner join --左向外连接,返回左边表所有符合条件的 left join --右向外连接,返回右边表所有符合条件的 right join --完整外部连接,左向外连接和右向外连接的合集 full join --交叉连接,也称笛卡儿积。返回左表中的每一行与右表中所有行的组合 cross join --补充: --左向外连接,返回左边表所有符合条件的, --注意这里没有第二个加号,会直接过滤掉数据,只显示符合条件的记录 select * from a, b where a.id = b.id(+) and b.id = 2; ID ID ---------- ---------- 2 2 --左向外连接,返回左边表所有符合条件的 --注意where上第二个加号,它的作用是修改右边表记录的显示,例如如果b.id(+) = 2,显示为2,否则显示null select * from a, b where a.id = b.id(+) and b.id(+) = 2; ID ID ---------- ---------- 2 2 3 1
### 全连接、自然连接和等值连接的区别与用法 #### 一、全连接 (Full Outer Join) 全连接是一种外连接形式,它会返回两个表中所有的匹配记录以及不匹配的记录。对于那些在另一个表中找不到对应关系的数据行,其字段会被填充为 `NULL` 值。 - **特点**: - 返回左表和右表的所有记录。 - 如果某条记录在另一张表中不存在,则对应的字段显示为 `NULL`。 - MySQL 并未原生支持全连接语法,但在 Oracle 和 PostgreSQL 中可以通过 `FULL OUTER JOIN` 实现[^2]。 - **SQL 示例**: ```sql SELECT * FROM tableA FULL OUTER JOIN tableB ON tableA.id = tableB.id; ``` --- #### 二、自然连接 (Natural Join) 自然连接是一种特殊的内连接,它基于两表中共有的同名列自动进行匹配,并且不会重复这些共有列的结果。 - **特点**: - 自动识别并比较两张表中的相同名称的列作为连接条件。 - 结果中只保留一份共同的列。 - 不需要显式声明 `ON` 条件,因为它是隐式的。 - **SQL 示例**: ```sql SELECT * FROM tableA NATURAL JOIN tableB; ``` 如果 `tableA` 和 `tableB` 都有名为 `id` 的列,则此操作相当于执行了一个基于 `id` 列的等值连接,但最终结果只会展示单一版本的 `id` 列[^1]。 --- #### 三、等值连接 (Equi-Join) 等值连接是最常见的连接方式之一,指通过某个或某些具体字段上的相等条件来进行关联查询的操作方法。 - **特点**: - 使用等于号 (`=`) 定义明确的关系表达式。 - 明确指出哪些字段应该被用来做匹配测试。 - 默认情况下属于一种内连接的形式除非特别说明其他类型的联结如左/右外部联接等等情况存在例外情形下适用不同规则处理相应逻辑流程实现预期目标功能效果达到最佳状态表现出来给定条件下完成任务所需资源消耗最小化原则考虑进去综合评估各方面因素之后得出结论如下所示[^3]. - **SQL 示例**: ```sql SELECT A.*, B.* FROM tableA AS A INNER JOIN tableB AS B ON A.common_field = B.common_field; ``` --- ### 总结对比表格 | 特性 | 全连接 | 自然连接 | 等值连接 | |-----------------|----------------------------|---------------------------|-------------------------| | 连接范围 | 左右表全部数据 | 共有名列交部分 | 符合指定条件的部分 | | 是否需定义 ON | 是 | 否 | 是 | | NULL 行处理 | 包含 | 排除 | 排除 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值