内连接和外连接

博客介绍了数据库连接相关知识,包括内连接,即两表对应匹配字段完全相同的连接;外连接又分左外连接和右外连接,左外连接返回左表所有行及右表匹配列值,无匹配用空值代替,右外连接则相反。

内连接:进行连接的两个表对应的相匹配的字段完全相同的连接

外连接又分为左外连接右外连接 

左外连接:两个表进行左连接时会返回左边表中的所有的行和右边表中与之相匹配的列值,没有相匹配的用空值代替。

右外连接:两个表进行右连接时会返回右边表中的所有的行和左边表中与之相匹配的列值,没有相匹配的用空值代替。

<think>我们正在讨论数据库连接的概念,特别是内连接外连接。根据用户的需求,用户希望了解内连接外连接的定义。我们将参考提供的引用内容,并结合数据库知识进行解释。 引用内容回顾: 引用[1]提到:内连接外连接的概念,内连接的例子是customers.customer_id = orders.customer_id。 引用[2]提到:全外连接(full join)等,并指出左连接、右连接、全外连接内连接的区别。 引用[3]提到:右外连接(右连接)的例子,以及左外连接(左连接)的写法。 根据这些引用,我们可以总结如下: 1. 内连接(INNER JOIN): 只返回两个表中满足连接条件的记录。即,只有当左表右表中的某行在连接条件上匹配时,才会返回该行。如果某一行在另一个表中没有匹配,则该行不会出现在结果中。 2. 外连接(OUTER JOIN): 外连接会返回一个表中的所有记录,即使另一个表中没有匹配的记录。外连接又分为三种: - 左外连接(LEFT OUTER JOIN):返回左表的所有记录,以及右表中匹配的记录。如果右表中没有匹配的记录,则结果集中右表的字段为NULL。 - 右外连接(RIGHT OUTER JOIN):返回右表的所有记录,以及左表中匹配的记录。如果左表中没有匹配的记录,则结果集中左表的字段为NULL。 - 全外连接(FULL OUTER JOIN):返回左表右表的所有记录。当某行在另一表中没有匹配时,对应的字段为NULL。 在引用[2]中,全外连接的例子显示了两个表中的所有记录,不匹配的部分用NULL填充。 下面我们用例子来说明: 假设有两个表: 表A:id, name 表B:id, job, A_id (外键关联表A的id) 内连接(INNER JOIN): SELECT A.name, B.job FROM A INNER JOIN B ON A.id = B.A_id; 结果:只返回AB中A.id等于B.A_id的行。 左外连接(LEFT OUTER JOIN): SELECT A.name, B.job FROM A LEFT OUTER JOIN B ON A.id = B.A_id; 结果:返回表A的所有行,如果表B中有匹配的行,则显示B.job;如果没有,则B.job为NULL。 右外连接(RIGHT OUTER JOIN): SELECT A.name, B.job FROM A RIGHT OUTER JOIN B ON A.id = B.A_id; 结果:返回表B的所有行,如果表A中有匹配的行,则显示A.name;如果没有,则A.name为NULL。 全外连接(FULL OUTER JOIN): SELECT A.name, B.job FROM A FULL OUTER JOIN B ON A.id = B.A_id; 结果:返回表A表B的所有行。如果某行在另一个表中没有匹配,则缺失的部分为NULL。 注意:MySQL不支持FULL OUTER JOIN,但可以通过左外连接外连接的并集(UNION)来实现。 在引用[3]中,右外连接的例子中,表B(salgrade)是主表,所以即使没有匹配的雇员(emp)记录,也会返回所有薪水等级(grade)。 总结定义: - 内连接:基于两个表之间的匹配条件,返回两个表中都存在的记录。 - 外连接:返回一个表(左连接时为左表,右连接时为右表,全连接时为两个表)的所有记录,以及另一个表中匹配的记录。没有匹配的部分用NULL填充。 根据上述内容,我们可以这样回答用户: </think>### 数据库连接的定义分类 在数据库查询中,连接(JOIN)用于合并多个表中相关联的数据。根据匹配规则的不同,主要分为内连接外连接两类: #### 1. **内连接(INNER JOIN)** - **定义**:仅返回两个表中**完全匹配**的行。如果某行在左表或右表中没有对应匹配项,则该行被排除。 - **数学表示**: 设左表为 $A$,右表为 $B$,连接条件是 $A.key = B.key$,则结果集为: $$ A \bowtie_{A.key=B.key} B = \{ (a,b) \mid a \in A, b \in B, a.key = b.key \} $$ - **示例**: ```sql SELECT customers.name, orders.product FROM customers INNER JOIN orders ON customers.id = orders.customer_id; ``` *结果仅包含有订单的客户及其订单信息*[^1]。 #### 2. **外连接(OUTER JOIN)** 保留至少一个表的所有行,缺失匹配项用 `NULL` 填充。分为三类: - **左外连接(LEFT JOIN)**: 返回左表全部行 + 右表匹配行(无匹配则为 `NULL`)。 $$ A \mathbin{\rlap{\;\times}\bowtie}_\text{left} B = \{ (a,b) \mid a \in A \} \cup \{ (a,\text{NULL}) \mid a \in A, \nexists b \in B: a.key=b.key \} $$ ```sql SELECT e.ename, s.grade FROM emp e LEFT JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal; ``` *结果包含所有员工(即使无薪资等级)*[^3]。 - **右外连接(RIGHT JOIN)**: 返回右表全部行 + 左表匹配行(无匹配则为 `NULL`)。 $$ A \mathbin{\rlap{\;\times}\bowtie}_\text{right} B = \{ (a,b) \mid b \in B \} \cup \{ (\text{NULL},b) \mid b \in B, \nexists a \in A: a.key=b.key \} $$ - **全外连接(FULL JOIN)**: 返回左表 + 右表所有行(无匹配项均为 `NULL`)。 $$ A \mathbin{\rlap{\;\times}\bowtie}_\text{full} B = (A \mathbin{\rlap{\;\times}\bowtie}_\text{left} B) \cup (A \mathbin{\rlap{\;\times}\bowtie}_\text{right} B) $$ ```sql SELECT a.name, b.job FROM A a FULL JOIN B b ON a.id = b.A_id; ``` *结果包含所有客户职位(即使无关联)*[^2]。 ### **核心区别总结** | 类型 | 保留左表所有行 | 保留右表所有行 | 匹配条件要求 | |------------|----------------|----------------|--------------| | 内连接 | ❌ | ❌ | ✔️ 必须匹配 | | 左外连接 | ✔️ | ❌ | ❌ 可不匹配 | | 右外连接 | ❌ | ✔️ | ❌ 可不匹配 | | 全外连接 | ✔️ | ✔️ | ❌ 可不匹配 | > 连接操作是数据库查询的核心,通过组合多表数据提供更全面的信息视图[^1]。实际应用中需根据是否需要保留未匹配数据选择连接类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值