一、 什么是多表连接?
多表连接是一种将两个或多个表中的数据组合在一起的 sql 操作。通过连接,我们可以根据表之间的关系(如主键和外键)提取相关联的数据。连接操作是关系型数据库的核心功能之一,广泛应用于数据分析、报表生成等场景。
二、 mysql 支持的连接类型
| 连接类型 | 作用 | 特点 | 适用场景 | mysql 支持 | 连接方式 |
|---|---|---|---|---|---|
inner join | 返回两个表中匹配的行。 | 只返回满足连接条件的记录。 | 需要获取两个表中完全匹配的数据。 | 支持 | 内连接 |
left join | 返回左表中的所有行,以及右表中匹配的行。如果右表中没有匹配的行,则返回 null。 | 左表为主,右表为辅。 | 需要获取左表中的所有数据,即使右表中没有匹配的记录。 | 支持 | 左外连接 |
right join | 返回右表中的所有行,以及左表中匹配的行。如果左表中没有匹配的行,则返回 null。 | 右表为主,左表为辅。 | 需要获取右表中的所有数据,即使左表中没有匹配的记录。 | 支持 | 右外连接 |
full outer join | 返回左表和右表中的所有行。如果某一行在另一个表中没有匹配的行,则返回 null。 | 返回两个表的并集。 | 需要获取两个表中的所有数据,即使没有匹配的记录。 | 不支持,但可以通过 union 模拟实现 | 全连接 |
注意:
1、outer join 是一种连接类型,它包括了 left join、right join 和 full outer join。它与 inner join 不同,outer join 会返回不仅包括匹配的行,还包括不匹配的行(用 null 填充)。outer join 是 left join、right join 和 full outer join 的总称。
2、默认情况下,join 是 inner join 的简写形式。
三、 多表连接的语法
多表连接的基本语法如下:
select 列名 from 表1 连接类型 join 表2 on 表1.列 = 表2.列;
- 连接类型:可以是
inner join、left join、right join等。 - on 子句:指定连接条件,通常是主键和外键的关系。
四、实战示例 数据准备
创建两个表 person 和 address,并插入测试数据:
create table person (
personid int primary key,
firstname varchar(50),
lastname varchar(50)
);
create table address (
addressid int primary key,
personid int,
city varchar(50),
state varchar(50)
);
insert into person (personid, firstname, lastname) values
(1, 'allen', 'wang'),
(2, 'bob', 'alice'),
(3, 'charlie', 'brown');
insert into address (addressid, personid, city, state) values
(1, 2, 'new york city', 'new york'),
(2, 3, 'leetcode', 'california'),
(3, 4, 'mountain view', 'california');(1) inner join 示例
返回 person 和 address 表中匹配的行:
select p.firstname, p.lastname, a.city, a.state from person p inner join address a on p.personid = a.personid;
结果:
| firstname | lastname | city | state |
|---|---|---|---|
| bob | alice | new york city | new york |
| charlie | brown | leetcode | california |
(2) left join 示例
返回 person 表中的所有行,以及 address 表中匹配的行:
select p.firstname, p.lastname, a.city, a.state from person p left join address a on p.personid = a.personid;
结果:
| firstname | lastname | city | state |
|---|---|---|---|
| allen | wang | null | null |
| bob | alice | new york city | new york |
| charlie | brown | leetcode | california |
(3) right join 示例
返回 address 表中的所有行,以及 person 表中匹配的行:
select p.firstname, p.lastname, a.city, a.state from person p right join address a on p.personid = a.personid;
结果:
| firstname | lastname | city | state |
|---|---|---|---|
| bob | alice | new york city | new york |
| charlie | brown | leetcode | california |
| null | null | mountain view | california |
(4) full outer join 模拟
mysql 不支持 full outer join,但可以通过 union 模拟实现:
select p.firstname, p.lastname, a.city, a.state from person p left join address a on p.personid = a.personid union select p.firstname, p.lastname, a.city, a.state from person p right join address a on p.personid = a.personid;
结果:
| firstname | lastname | city | state |
|---|---|---|---|
| allen | wang | null | null |
| bob | alice | new york city | new york |
| charlie | brown | leetcode | california |
| null | null | mountain view | california |
五、连接的性能优化
(1) 索引的使用
在连接字段(如 personid)上创建索引,可以显著提高查询性能:
create index idx_personid on address(personid);
注意:本文的测试数据创建了主键,默认创建了索引 (2) 查询优化技巧
- 避免使用
select *,明确指定需要的列。 - 使用
explain分析查询计划,确保查询使用了索引。 - 在连接条件中使用等值比较(
=),避免使用复杂表达式。
到此这篇关于mysql 多表连接(inner join、left join、right join、full outer join)的文章就介绍到这了,更多相关mysql 多表连接内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论