Mysql多表查询详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: Mysql多表查询详解

1、多表连接分类:

  • A)内连接:join,inner join
  • B)外连接:left join,left outer join,right join,right outer join,union
  • C)交叉连接:cross join

2、数据表

两张表格如下:

TableA:

id age
1 10
2 11
3 12
4 13

TableB:

id age
2 zhang
3 li
4 zhou
5 chen

3、内连接(inner join 或者join)

select a.*, b.* from tablea a
inner join tableb b
on a.id = b.id

select a.*, b.* from tablea a
join tableb b
on a.id = b.id

结果如下:

id age id age
2 11 2 zhang
3 12 3 li
4 13 4 zhou

4、外连接(六种场景)

4.1 left join 或者left outer join(等同于left join)
select a.*, b.* from tablea a
left join tableb b
on a.id = b.id

或者

select a.*, b.* from tablea a
left outer join tableb b
on a.id = b.id

结果如下,TableB中更不存在的记录填充Null:

id age id age
1 10 Null Null
2 11 2 zhang
3 12 3 li
4 13 4 zhou
4.2 [left join 或者left outer join(等同于left join)] + [where B.column is null]
select a.id aid,a.age,b.id bid,b.name from tablea a
left join tableb b
on a.id = b.id
Where b.id is null

结果如下:

id age id age
1 10 Null Null
4.3 right join 或者fight outer join(等同于right join)
select a.id aid,a.age,b.id bid,b.name from tablea a
right join tableb b
on a.id = b.id

结果如下,TableB中更不存在的记录填充Null:

id age id age
2 11 2 zhang
3 12 3 li
4 13 4 zhou
Null Null 5 chen
4.4 [left join 或者left outer join(等同于left join)] + [where A.column is null]
select a.id aid,a.age,b.id bid,b.name from tablea a
right join tableb b
on a.id = b.id
where a.id is null

结果如下:

id age id age
Null Null 5 chen
4.5 full join (mysql不支持,但是可以用 left join union right join代替)
select a.id aid,a.age,b.id bid,b.name from tablea a
left join tableb b
on a.id = b.id
union
select a.id aid,a.age,b.id bid,b.name from tablea a
right join tableb b
on a.id = b.id

union过后,重复的记录会合并(id为2,3,4的三条记录),所以结果如下:

id age id age
1 10 Null Null
2 11 2 zhang
3 12 3 li
4 13 4 zhou
Null Null 5 chen
4.6 full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+isnull代替)
select a.id aid,a.age,b.id bid,b.name from tablea a
left join tableb b
on a.id = b.id
where b.id is null
union
select a.id aid,a.age,b.id bid,b.name from tablea a
right join tableb b
on a.id = b.id
where a.id is null

结果如下:

id age id age
1 10 Null Null
Null Null 5 chen

5、交叉连接 (cross join)

5.1 cross join:

实际应用中还有这样一种情形,想得到排列组合,即笛卡儿积,这个就不好用集合和元素来表示了。需要用到cross join

select a.id aid,a.age,b.id bid,b.name from tablea a
cross join tableb b

结果如下:

id age id age
1 10 2 zhang
2 11 2 zhang
3 12 2 zhang
4 13 2 zhang
1 10 3 li
2 11 3 li
3 12 3 li
4 13 3 li
1 10 4 zhou
2 11 4 zhou
3 12 4 zhou
4 13 4 zhou
1 10 5 chen
2 11 5 chen
3 12 5 chen
4 13 5 chen
5.2 cross join指定条件 (where):
select a.id aid,a.age,b.id bid,b.name from tablea a
cross join tableb b
where a.id = b.id

结果如下;

id age id age
2 11 2 zhang
3 12 3 li
4 13 4 zhou

注:这种情况下实际上实现了内连接的效果

6、总结

注意事项:

上面仍然存在遗漏,那就是mysql对sql语句的容错问题,即在sql语句不完全符合书写建议的情况,mysql会允许这种情况,尽可能地解释它:

  • 一般cross join后面加上where条件,但是用cross join+on也是被解释为cross join+where;
  • 一般内连接都需要加上on限定条件,如上面场景2.1;如果不加会被解释为交叉连接;
  • 如果连接表格使用的是逗号,会被解释为交叉连接;
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 存储 关系型数据库
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
|
2月前
|
关系型数据库 MySQL
3. Mysql 如何实现多表查询
MySQL多表查询主要包括内连接和外连接。内连接有隐式和显式:隐式是通过`From 表A, 表B where 连接条件`,显式是`From 表A inner join 表B on 连接条件`。外连接包括左外连接(`left join`)、右外连接(`right join`)和全外连接(较少使用)。此外,还有交叉连接(`cross join`),但也较少使用。
27 0
|
10天前
|
关系型数据库 MySQL 数据库
关系型数据库MySQL开发要点之多表查询2024详解
关系型数据库MySQL开发要点之多表查询2024详解
16 2
|
10天前
|
关系型数据库 MySQL 数据库
MySQL数据库开发之多表查询数据准备及案例实操
MySQL数据库开发之多表查询数据准备及案例实操
21 1
|
16天前
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
28天前
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
26 5
|
28天前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(4)-实例练习、多表查询总结
MySQL数据库——多表查询(4)-实例练习、多表查询总结
20 1
|
28天前
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
22 1
|
28天前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(2)-内连接、外连接
MySQL数据库——多表查询(2)-内连接、外连接
19 1
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】MySQL之多表查询
【MySQL进阶之路 | 基础篇】MySQL之多表查询