12.Mysql 多表数据横向合并和纵向合并

Mysql 函数参考和扩展:Mysql 常用函数和基础查询Mysql 官网

Mysql 语法执行顺序如下,一定要清楚!!!运算符相关,可前往 Mysql 基础语法和执行顺序扩展。

sql 复制代码
(8) select (9) distinct (11)<columns_name list>
(1) from <left_table>
(3) <join_type> join <right_table>
(2) on <join_condition>
(4) where <where_condition>
(5) group by <group_by columns_name list>
(6) with <rollup>
(7) having <having_condition>
(10) order by <order_by columns_name list>
(12) limit <[offset,] rows>
;

横向合并

又称多表联结,是通过不同表中具有相同意义的关键字段,将多个表进行连接。

多表连接的结果通过三个属性决定

  • 方向性:在外连接中写在前边的表为左表,写在后边的表为右表,左右没有多大关系,主要取决于连接方式。
  • 主附关系:主表要出所有的数据范围,附表与主表无匹配项时标记为null,内连接无主附表之分。
  • 对应关系:关键字段中有重复的表为多表,没有重复的表为一表。对应关系有一对一、一对多、多对一。

常见的连接方式有:内连接和外连接(左连接和右连接)。

示例 :有两个表 t1和 t2,t1表的key1元素存在多个,t2表中key2元素为唯一,关键连接字段是 t1.key1=t2.key2。

1)内连接[inner] join。按照关键字段合并两个表,返回满足条件匹配的行。

sql 复制代码
select key1,v1,key2,v2
from t1
inner join t2
on t1.key1 = t2.key2

2)左连接left join。按照关键字段合并两个表,结果中除了包括满足条件的行外,还包括左表的所有行。

sql 复制代码
select key1,v1,key2,v2
from t1
left join t2
on t1.key1 = t2.key2

3)右连接right join。按照关键字段合并两个表,结果中除了包括满足条件的行外,还包括右表的所有行。

sql 复制代码
select key1,v1,key2,v2
from t1
right join t2
on t1.key1 = t2.key2

4)左反连接:按照关键字段合并两个表,返回左表有,而右表没有的记录。

sql 复制代码
select key1,v1,key2,v2
from t1
left join t2
on t1.key1 = t2.key2
where t2.key2 is null

5)右反连接:按照关键字段合并两个表,返回右表有,而左表没有的记录。

sql 复制代码
select key1,v1,key2,v2
from t1
right join t2
on t1.key1 = t2.key2
where t1.key1 is null

6)笛卡尔积:合并两个表,返回的记录数量是两个表的数量乘积,详情如下:

sql 复制代码
# 方法一
select key1,v1,key2,v2
from t1
join t2;
# 方法二
select key1,v1,key2,v2
from t1,t2;

其实还有全连接(full join),但是在Mysql中没有,需要通过其他方式实现,这里给大家放到下面的纵向合并讲解。

多表联结横向合并需要特别注意所关联的关键字段,避免多对多情况或者没写关联的关键字段,并且保证维度表关键字段唯一,否则会出现笛卡尔积得到叉乘数据记录。

纵向合并

纵向合并,可以理解为追加或者添加数据记录。将其他数据集合并到主数据集。

注意事项

  1. 两张表必须拥有相同数量的字段
  2. 两张表字段的顺序必须相同
  3. 两张表对应字段的数据类型必须一致

※字段名可以不相同,选取主数据集的字段名

union all:返回多个数据集中的并集,不会去除重复记录。其实就是上面的左反和右反连接合并后的结果。

sql 复制代码
# 这里将左连接和
select key1,v1,key2,v2
from t1
left join t2
on t1.key1 = t2.key2
where t2.key2 is null
union all
select key1,v1,key2,v2
from t1
right join t2
on t1.key1 = t2.key2
where t1.key1 is null;

union:返回多个数据集中的并集,并且去除重复记录。下面这个示例其实就类似于Oracle/SQL Server中的full join。

sql 复制代码
select key1,v1,key2,v2
from t1
left join t2
on t1.key1 = t2.key2
union
select key1,v1,key2,v2
from t1
right join t2
on t1.key1 = t2.key2;

union 就是将多段功能类似的sql连接,并去掉重复的行,有distinct的功能。

union all 则只是单纯的将多段类似sql连接,将复杂sql按照不同的功能拆分成一小段sql进行拼接,可以有效提高查询效率。

批注

join和union的用法在sql中非常重要,为了减少数据冗余,相同的数据不需要在多个表中重复存储,而应当将其拆分到单独的表中,以便更有效地管理数据,简化维护工作,并且在系统需要扩展时更容易进行水平扩展。因此,除非有特定要求,在实际应用中,尽量将维度表和事实表分开存储,需要时再使用横向合并和纵向合并拼接数据,以避免相关维度表如需调整,则要调整所有表的情况。

相关推荐
星环处相逢6 分钟前
MySQL MHA 全解析与实战部署指南
数据库·mysql
qq_12498707539 分钟前
基于springboot+vue+mysql的校园博客系统(源码+论文+部署+安装)
java·vue.js·spring boot·mysql·毕业设计
一只专注api接口开发的技术猿10 分钟前
构建电商数据中台:基于淘宝 API 关键词搜索接口的设计与实现
大数据·开发语言·数据库
未来之窗软件服务23 分钟前
服务器运维(十八)国产化数据库服务漏洞安全——东方仙盟炼气期
运维·服务器·数据库·服务器运维
MM_MS38 分钟前
SQL Server数据库和Visual Studio (C#)联合编程
开发语言·数据库·sqlserver·c#·visual studio
韩立学长1 小时前
基于Springboot民族文化与旅游网站j9x74dt2(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
runfarther1 小时前
mysql_mcp_server部署及应用案例
linux·mysql·centos·mcp
eventer1231 小时前
在国产ARM64环境下从源码编译Greptime DB及构建Docker镜像实践
数据库·docker·容器
川石课堂软件测试1 小时前
自动化测试的基本概念及常用框架
数据库·python·功能测试·测试工具·单元测试·自动化·流程图
dyxal1 小时前
Windows 内网环境离线安装 MySQL 完整指南
windows·mysql·adb