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> ;
又称多表联结,是通过不同表中具有相同意义的关键字段,将多个表进行连接。
多表连接的结果通过三个属性决定
常见的连接方式有:内连接和外连接(左连接和右连接)。
示例:有两个表 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
2)左连接:left join。按照关键字段合并两个表,结果中除了包括满足条件的行外,还包括左表的所有行。
select key1,v1,key2,v2 from t1 left join t2 on t1.key1 = t2.key2
3)右连接:right join。按照关键字段合并两个表,结果中除了包括满足条件的行外,还包括右表的所有行。
select key1,v1,key2,v2 from t1 right join t2 on t1.key1 = t2.key2
4)左反连接:按照关键字段合并两个表,返回左表有,而右表没有的记录。
select key1,v1,key2,v2 from t1 left join t2 on t1.key1 = t2.key2 where t2.key2 is null
5)右反连接:按照关键字段合并两个表,返回右表有,而左表没有的记录。
select key1,v1,key2,v2 from t1 right join t2 on t1.key1 = t2.key2 where t1.key1 is null
6)笛卡尔积:合并两个表,返回的记录数量是两个表的数量乘积,详情如下:
# 方法一 select key1,v1,key2,v2 from t1 join t2; # 方法二 select key1,v1,key2,v2 from t1,t2;
其实还有全连接(full join),但是在Mysql中没有,需要通过其他方式实现,这里给大家放到下面的纵向合并讲解。
多表联结横向合并需要特别注意所关联的关键字段,避免多对多情况或者没写关联的关键字段,并且保证维度表关键字段唯一,否则会出现笛卡尔积得到叉乘数据记录。
纵向合并,可以理解为追加或者添加数据记录。将其他数据集合并到主数据集。
注意事项:
※字段名可以不相同,选取主数据集的字段名
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;
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;
union 就是将多段功能类似的sql连接,并去掉重复的行,有distinct的功能。
union all 则只是单纯的将多段类似sql连接,将复杂sql按照不同的功能拆分成一小段sql进行拼接,可以有效提高查询效率。
join和union的用法在sql中非常重要,为了减少数据冗余,相同的数据不需要在多个表中重复存储,而应当将其拆分到单独的表中,以便更有效地管理数据,简化维护工作,并且在系统需要扩展时更容易进行水平扩展。因此,除非有特定要求,在实际应用中,尽量将维度表和事实表分开存储,需要时再使用横向合并和纵向合并拼接数据,以避免相关维度表如需调整,则要调整所有表的情况。