[MySQL]MySQL内外连接

文章详细介绍了MySQL中的内连接和外连接,包括内连接的筛选过程,左外连接和右外连接的概念及使用场景。通过示例展示了如何使用SQL语句进行连接查询,如显示特定员工的部门信息,以及查询所有学生信息即使没有成绩等。最后提供了一个练习,列出所有部门及其员工信息,包括没有员工的部门,通过左外连接和右外连接两种方式实现。

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

[MySQL]MySQL内外连接

1. 内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,也是在开发过程中使用的最多的连接查询。

语法:

SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;
  • 内连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明。
  • 内连接的效果和多表查询的效果相同。

示例:显示SMITH的名字和部门名称。

现给出以下表:

image-20230713185707754

此表为员工表,其中ename就是员工姓名。

还有另一张表:

image-20230713185744436

此表为部门表,其中dname就是部门名称。

要显示SMITH的名字和部门名称,可以选择直接对两张表进行笛卡尔积运算,然后筛选出部门号相同,名字是SMITH的记录:

image-20230713190015916

除了上面这种方式还可以直接使用内连接,内连接的是员工表和部门表,连接条件是部门号相同,其他条件为姓名为SMITH:

image-20230713190330997

2. 外连接

2.1 左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。

语法:

SELECT ... FROM t1 LEFT JOIN t2 ON 连接条件 [LEFT JOIN t3 ON 连接条件] ... AND 其他条件;
  • 左侧的表完全显示。
  • 右侧的表中连接条件满足的就将数据连接,不满足的将null值连接。

测试样例: 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来。

用下面的SQL语句创建两张表,然后插入一部分数据。

-- 建两张表
create table stu (id int, name varchar(30)); -- 学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (id int, grade int); -- 成绩表
insert into exam values(1, 56),(2,76),(11, 8);

学生表的结构和数据如下:

image-20230713192103008

成绩表的结构和数据如下:

image-20230713192145796

如果使用内连接,连接条件为id相同,只会显示id相同的连接记录:

image-20230713192542058

由于学生没有成绩,也要将学生的个人信息显示出来,因此需要将学生表放在左侧并且使用左外连接,连接条件为id相同,id相同且成绩表中有成绩的会将数据连接过来,id相同且成绩表中没有成绩的会将null值连接过来:

image-20230713192251410

2.2 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接。

语法:

SELECT ... FROM t1 RIGHT JOIN t2 ON 连接条件 [RIGHT JOIN t3 ON 连接条件] ... AND 其他条件;
  • 右侧的表完全显示。
  • 左侧的表中连接条件满足的就将数据连接,不满足的将null值连接。

示例: 对学生表和成绩表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来。

由于需要把所有的成绩都显示出来,因此需要将成绩表放在右侧并且使用右外连接,连接条件为id相同,如果该成绩没有学习对应,左侧会将null值连接过来。

image-20230713192906455

3. 简单练习

列出部门名称和这些部门的员工信息,同时列出没有员工的部门。

由于需要部门表和员工表,需要先查看一下表的数据:

部门表的数据如下:

image-20230713194010249

员工表的数据如下:

image-20230713194051108

列出部门名称和这些部门的员工信息,同时列出没有员工的部门,由此可以看出无论有没有员工都要显示部门,因此可以选择将部门表作为左侧表进行左外连接,连接条件为部门号相同,为了方便查看我们对结果按照部门号进行升序排序:

image-20230713194449813

同样的,还可以将部门表作为右侧表进行右外连接,连接条件为部门号相同,为了方便查看我们对结果按照部门号进行升序排序:

image-20230713194555603

### MySQL 中 Inner Join 和 Outer Join 的概念及用法 #### 内连接 (Inner Join) 内连接返回两个表中满足连接条件的记录。这意味着只有当左表中的某条记录在右表中有匹配项时,才会被包含在查询结果集中。 ```sql SELECT t1.column_name, t2.column_name FROM table1 t1 INNER JOIN table2 t2 ON t1.common_column = t2.common_column; ``` 此 SQL 语句会选取 `table1` 和 `table2` 中具有相同 `common_column` 值的所有行[^1]。 #### 外连接 (Outer Join) 外连接分为三种类型:左外连接 (`LEFT OUTER JOIN`)、右外连接 (`RIGHT OUTER JOIN`) 和全外连接 (`FULL OUTER JOIN`)。对于 MySQL 而言,默认情况下只支持前两种类型的外连接;而全外连接可以通过组合使用左外连接和并集操作来实现。 ##### 左外连接 (Left Outer Join) 左外连接返回左边表格所有的记录以及右边表格中符合条件的数据。如果右边没有找到对应的记录,则结果集中相应的列将填充为 NULL。 ```sql SELECT t1.column_name, t2.column_name FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.common_column = t2.common_column; ``` 上述命令将会获取来自 `table1` 所有数据,并尝试寻找 `table2` 中相匹配的信息。如果没有发现任何关联关系,在最终的结果里这些字段会被设为空值[^3]。 ##### 右外连接 (Right Outer Join) 与左外连接相反,右外连接保留右侧表内的全部记录,即使左侧不存在对应项目也会显示出来: ```sql SELECT t1.column_name, t2.column_name FROM table1 t1 RIGHT OUTER JOIN table2 t2 ON t1.common_column = t2.common_column; ``` 这段代码的作用是从 `table2` 开始查找所有可能存在的配对情况,同时保持原样呈现那些找不到伙伴的对象实例。 自版本 **8.0.20** 后,MySQL 对于哈希联接的支持扩展到了外部联接(包括反向半联接和半联接),这使得处理复杂查询变得更加高效[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

好想写博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值