MySQL数据库表关联

在实际业务项目中经常会存在不同的业务表进行关联查询的需要,本文从如下几个方式讲解。

1、where

语法格式:

1
from a, b where a.id = b.id

where使用a表和b表的一个或者多个字段进行数据关联,如果关联时其中一方没有符合条件的记录,那么查询结果返回为空

1.1 a和b有一条记录匹配

1
2
3
4
5
6
7
mysql> select * from a, b where a.id = b.id and a.id = 2;
+----+-----+----+-----+
| id | var | id | var |
+----+-----+----+-----+
| 2 | C | 2 | D |
+----+-----+----+-----+
1 row in set (0.00 sec)

1.2 a和b表数据量不匹配

当a和b表匹配条件的数据量不一致时,所有符合条件的记录都会返回;数据量少的一方会将结果进行复制拼接返回到客户端

1
2
3
4
5
6
7
8
mysql> select * from a, b where a.id = b.id and a.id = 1;
+----+-----+----+-----+
| id | var | id | var |
+----+-----+----+-----+
| 1 | B | 1 | A |
| 1 | A | 1 | A |
+----+-----+----+-----+
2 rows in set (0.01 sec)

1.3 无匹配的记录

当根据条件匹配查询无记录时,MySQL不会返回任何记录

1
2
mysql> select * from a, b where a.id = b.id and b.id = 3;
Empty set (0.00 sec)

2、左关联left join

语法:

1
xxx left join yyy on 

left join以左边表为驱动表(主表),在进行数据匹配时,驱动表的记录只要符合查询条件都会返回,从表的记录如果符合查询条件会拼接到结果集右边,如果没有记录匹配设置字段值为NULL拼接到结果集右边返回到客户端

1
2
3
4
5
6
7
8
mysql> select t1.*, t2.* from a t1 left join b t2 on t1.id = t2.id where t1.id in (2, 4);
+----+-----+------+------+
| id | var | id | var |
+----+-----+------+------+
| 2 | C | 2 | D |
| 4 | F | NULL | NULL |
+----+-----+------+------+
2 rows in set (0.00 sec)

3、右关联 right join

语法格式:

1
xxx right join yyy on 

right joinleft join原理类似,只是驱动表是右边表,同样的优先匹配驱动表记录,驱动表的记录只要符合查询条件都会返回,从表的记录如果符合查询条件会拼接到结果集左边,如果没有记录匹配设置字段值为NULL拼接到结果集左边返回到客户端

1
2
3
4
5
6
7
8
mysql> select t1.*, t2.* from a t1 right join b t2 on t1.id = t2.id where t2.id in (2, 3);
+------+------+----+-----+
| id | var | id | var |
+------+------+----+-----+
| 2 | C | 2 | D |
| NULL | NULL | 3 | E |
+------+------+----+-----+
2 rows in set (0.00 sec)

4、union并集关联

语法格式:

1
select xxx from a union select yyy from b; 

union操作不需要left joinright joinon进行条件关联,但是查询结果字段位数需要一一对应,union操作会将结果集进行纵向合并返回;各自的sql语句独立可以有自己的where条件

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select t1.* from a t1 union select t2.* from b t2;
+----+-----+
| id | var |
+----+-----+
| 1 | A |
| 1 | B |
| 2 | C |
| 4 | F |
| 2 | D |
| 3 | E |
+----+-----+
6 rows in set (0.01 sec)

查询子句包含where条件:

1
2
3
4
5
6
7
8
9
10
11
mysql> select t1.* from a t1 union select t2.* from b t2 where t2.id = 1
-> ;
+----+-----+
| id | var |
+----+-----+
| 1 | A |
| 1 | B |
| 2 | C |
| 4 | F |
+----+-----+
4 rows in set (0.00 sec)

5、附录

5.1 建表语句

1
2
3
4
5
6
7
8
9
create table a (
id int not null,
val varchar(5) not null
);

create table b(
id int not null,
val varchar(5) not null
);

5.2 初始数据

1
2
insert into a values (1, 'A'), (1, 'B'), (2, 'C'), (4, 'F');
insert into b values (1, 'A'), (2, 'D'), (3, 'E');

MySQL数据库表关联
https://probiecoder.cn/mysql/join.html
作者
duwei
发布于
2025年4月22日
许可协议