内连接、外连接的区别及作用

1.基本介绍

不管是内连接、外连接还是带where子句的多表查询,都组合自多个表,并生成结果表。

1.内连接只返回两个表中连接字段相等的行。inner join(等值连接) 只返回两个表中联结字段相等的数据
2.左外连接(也称左连接)返回包括左表中的所有记录和右表中连接字段相等的记录。以左表为基表,在from子句中使用关键字left outer join”或关键字“left join”来连接两张表。
3.右外连接(也称右连接)返回包括右表中的所有记录和左表中连接字段相等的记录。以右表为基表,在from子句中使用关键字“right outer join”或关键字“right join”来连接两张表。
4.全外连接返回左右表中所有的记录和左右表中连接字段相等的记录。在from子句中使用关键字“full outer join”或关键字“full join”来连接两张表。

5.交叉连接(笛卡尔积):返回被连接的两个表所有数据行的笛卡尔积。返回结果集合中的数据行数等于第一个表中复合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

 

6.左连接与内连接的关系:左外连接 = 内连接 + 左边表中失配的元组(其中,缺少的右边表中的属性值用NULL表示)

 

 

7. 右连接与内连接的关系:右外连接 = 内连接 + 右边表中失配的元组(其中,缺少的左边表中的属性值用NULL表示)

8.全外连接与内连接的关系:内连接 + 左边表中失配的元组 + 右边表中失配的元组。

 9.交叉连接

 

 2.代码演示

 1.交叉连接(又称笛卡尔积)

--第一种
select * from tb1 cross join tb2;
--第二种
select * from tb1 join tb2;
--第三种
select * from tb1,tb2;   --纯粹连接查询
--第三种+where条件
select * from tb1,tb2 where tb1.id=tb2.id;

2.内连接

--语法(内外连接模板都如此)
select 列名
from 表名1
inner join 表名2
on 条件;

--实操:根据学生表xsb和学生成绩表cjb,使用内连接查询每个学生及其选课成绩的详细信息。
select * from xsb
inner join cjb
on xsb.xh=cjb.xh;

3.左外连接/右外连接

作用:实现两表的连接,可以查询展示两表中的需要信息。区别如下:

--左连接,查询在学生表中的所有学号的有关信息
select * from xsb
left join cjb
on xsb.xh=cjb.xh;

--右链接,查询在成绩表中的所有学号的有关信息
select * from xsb
right join cjb
on xsb.xh=cjb.xh;

4.全外连接 

select * from xsb
full join cjb
on xsb.xh=cjb.xh;

参考:

1.内连接、外连接、全外连接、交叉连接用法汇总(个人记录使用)_Wind2814的博客-CSDN博客_全连接 外连接

2.(1条消息) 内连接、左外连接与右外连接的区别及作用介绍_吴迪98的博客-CSDN博客_左连接,右连接,内连接,外连接的区别 

<think>好的,我需要帮助用户了解Oracle数据库内连接外连接的用法及区别。首先,我需要回顾一下内连接外连接的基本概念,以及它们在Oracle中的具体实现方式。根据提供的引用资料,特别是引用[1]和引用[3],用户可能已经对左连接、右连接和全外连接有一些了解,但需要更详细的解释和示例。 首先,我应该明确内连接(INNER JOIN)的作用是返回两个表中匹配的行。而外连接包括左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL JOIN),它们分别返回左表的所有行、右表的所有行或两个表的所有行,即使在另一表中没有匹配。 接下来,用户提到的Oracle中使用(+)符号进行外连接的方法,这在引用[1]中有详细说明。需要解释这种旧式语法标准SQL的LEFT/RIGHT JOIN的区别,并给出示例。同时,引用[3]中的示例可以帮助说明外连接的结果。 然后,我应该对比这两种语法,说明它们的使用场景和优缺点。比如,使用(+)符号可能在旧版Oracle中常见,而标准SQL的JOIN语法更易读且通用。 还需要注意全外连接在Oracle中的支持情况,引用[3]提到并非所有数据库都支持,但Oracle是否支持呢?根据我的知识,Oracle是支持FULL OUTER JOIN的,但用户可能需要验证这一点。 另外,用户提供的引用[2]和引用[4]涉及使用不同编程语言连接Oracle数据库的示例,但当前问题主要关注SQL语法,因此这些引用可能暂时不需要深入讨论,除非用户需要结合编程示例,但根据问题描述,重点在SQL用法。 最后,我需要确保回答结构清晰,分点解释内连接外连接,提供示例,并比较不同的语法。同时,生成的相关问题应该主题相关,帮助用户进一步探索。</think>### Oracle数据库内连接外连接使用详解 #### 一、内连接(INNER JOIN) **作用**:仅返回两个表中满足条件的匹配行 **语法**: ```sql SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段 = 表2.字段; ``` **示例**: ```sql SELECT e.employee_name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id; ``` 结果仅显示有对应部门的员工信息[^3]。 #### 二、外连接(OUTER JOIN) ##### 1. 左外连接(LEFT JOIN) **作用**:返回左表全部记录+右表匹配记录 **标准SQL语法**: ```sql SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.字段 = 表2.字段; ``` **Oracle特有(+)语法**: ```sql SELECT e.employee_name, d.department_name FROM employees e, departments d WHERE e.department_id = d.department_id(+); ``` 示例结果会包含所有员工,未分配部门的员工其部门字段显示为NULL[^1]。 ##### 2. 右外连接(RIGHT JOIN) **作用**:返回右表全部记录+左表匹配记录 **标准SQL语法**: ```sql SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.字段 = 表2.字段; ``` **Oracle特有(+)语法**: ```sql SELECT e.employee_name, d.department_name FROM employees e, departments d WHERE e.department_id(+) = d.department_id; ``` 示例结果会包含所有部门,无员工的部门其员工名字段显示为NULL[^3]。 ##### 3. 全外连接(FULL OUTER JOIN) **作用**:返回两表所有记录,无匹配则补NULL **语法**: ```sql SELECT * FROM 表1 FULL OUTER JOIN 表2 ON 表1.字段 = 表2.字段; ``` Oracle支持该语法,但无法用(+)实现。 #### 三、关键区别对比 | 类型 | 匹配要求 | 非匹配数据保留方向 | Oracle语法特性 | |-----------|--------------|------------|-----------------------| | INNER JOIN | 必须双方匹配 | 不保留 | 无特殊符号 | | LEFT JOIN | 左表数据必须保留 | 保留左表 | 可用`字段=字段(+)` | | RIGHT JOIN | 右表数据必须保留 | 保留右表 | 可用`字段(+)=字段` | | FULL JOIN | 不要求匹配 | 双方都保留 | 必须使用标准语法,不支持(+)符号[^3] | #### 四、性能注意 1. 外连接内连接消耗更多资源 2. (+)语法需注意运算符位置:`A.字段 = B.字段(+)` 表示左连接 3. 建议优先使用标准ANSI JOIN语法以提高可读性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的小羽儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值