12.Mysql 多表数据横向合并和纵向合并
作者:mmseoamin日期:2024-04-27

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

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

(8) select (9) distinct (11)
(1) from 
(3)  join 
(2) on 
(4) where 
(5) group by 
(6) with 
(7) having 
(10) order by 
(12) limit <[offset,] rows>
;

横向合并

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

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

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

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

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

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

    select key1,v1,key2,v2
    from t1
    inner join t2
    on t1.key1 = t2.key2
    

    12.Mysql 多表数据横向合并和纵向合并,在这里插入图片描述,第1张

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

    select key1,v1,key2,v2
    from t1
    left join t2
    on t1.key1 = t2.key2
    

    12.Mysql 多表数据横向合并和纵向合并,在这里插入图片描述,第2张

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

    select key1,v1,key2,v2
    from t1
    right join t2
    on t1.key1 = t2.key2
    

    12.Mysql 多表数据横向合并和纵向合并,在这里插入图片描述,第3张

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

    select key1,v1,key2,v2
    from t1
    left join t2
    on t1.key1 = t2.key2
    where t2.key2 is null
    

    12.Mysql 多表数据横向合并和纵向合并,在这里插入图片描述,第4张

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

    select key1,v1,key2,v2
    from t1
    right join t2
    on t1.key1 = t2.key2
    where t1.key1 is null
    

    12.Mysql 多表数据横向合并和纵向合并,在这里插入图片描述,第5张

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

    # 方法一
    select key1,v1,key2,v2
    from t1
    join t2;
    # 方法二
    select key1,v1,key2,v2
    from t1,t2;
    

    12.Mysql 多表数据横向合并和纵向合并,在这里插入图片描述,第6张

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

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

    纵向合并

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

    注意事项:

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

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

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

    # 这里将左连接和
    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;
    

    12.Mysql 多表数据横向合并和纵向合并,在这里插入图片描述,第7张

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

    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;
    

    12.Mysql 多表数据横向合并和纵向合并,在这里插入图片描述,第8张

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

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

    批注

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