【转】mysql的union、left join、 right join、 inner join和视图学习

时间:2023-03-08 16:32:18
【转】mysql的union、left join、 right join、 inner join和视图学习

1.联合 union 进行多个查询语句时,要求多次查询的结果列数必须一样。此时,查询的结果以第一个sql语句的列名为准且union会自动去重复我们应该使用union all。 例......

【转】mysql的union、left join、 right join、 inner join和视图学习

1.联合 union 进行多个查询语句时,要求多次查询的结果列数必须一样。此时,查询的结果以第一个sql语句的列名为准且union会自动去重复我们应该使用union all。

例如:

select id,sum(num) from (select * from ta union all select * from tb) as tmp group by id;

select id,sum(num) from (select * from ta union select * from tb);

select id,sum(num) from (select * from ta union select * from tb) as tmp;

请自己测试以上三个语句的结果;

注意:ta和tb的列数必须一样,否则不能写成 select * from ta union select * from tb;*应该替换成具体的字段名;

当子语句的中含有where、order by或limit时,子语句应该用括号括起来。

如:

select id,sum(num) from (select * from taorder by id desc union all select * from tb order by id desc) as tmp group by id; 错误的写法

select id,sum(num) from ((select * from ta order by id desc) union all
(select * from tb order by id desc)) as tmp group by id;
正确的写法,重复了而且得不到想要的结果

select id,sum(num) from ((select * from ta ) union all (select * from tb) order by id desc) as tmp group by id; 一般都是写在合并后

在字句中,只有order by 配合 limit 使用才会有意义,否则会被语法分析器去除。

2.连接 join、left join、right join、inner join左连接、右连接、内连接、外连接(目前MySQL并不支持,但是可以用 左连接+union+连接 实现)

连接的意义是:为了得到更完整的信息(如:学生信息),此时,我需要从更多的表(可能是学生信息表、学生成绩、学生家庭表等)进行查找。

JOIN: 如果表中有至少一个匹配,则返回行。

LEFT JOIN(以左表为基准): 即使右表中没有匹配,也从左表返回所有的行。

RIGHT JOIN(以右表为基准): 即使左表中没有匹配,也从右表返回所有的行。

左连接和有连接是可以互换的。如 ta left join tb =========== tb right join ta 都是表示以ta表为基准进行查询。

可以多次使用连接,但是当重复连接某一张表的时候,我们应该使用 as 给表取别名。

如:selectt1.name,`match_result`,t2.name,`match_time` from ta left jointb
as t1 on ta.host_id=t1.id left join tb as t2 on ta.guest_id =t2.id;

3.视图的学习(可以对一些开发人员访问数据库的权限进行设置,看到该看到的,不该看到的就无法看到,如:sina.qq开发的接口,第三方用户只能使用一些数据)

定义:视图是虚表,是从一个或几个基本表(或视图)中导出的表,在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。

作用:
简单性(看到的就是需要的)、安全性(通过视图用户只能查询和修改他们所能见到的数据)、大数据分表的时候用到(当一张表的数据量比较大的时候)。使用权限可被限制在基表的行的子集上。使用权限可被限制在基表的列的子集上。使用权限可被限制在基表的行和列的子集上。使用权限可被限制在多个基表的连接所限定的行上。使用权限可被限制在基表中的数据的统计汇总上。使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。

视图与表的关系(他们是一一对应的,类似函数与反函数的关系):

1.修改某张表时,则与该表有关视图的数据也会发生变化。

2.修改视图时,若视图的列和表的列一一对应(也就是说没有聚合函数sum() avg() count() max() min()等、group by),则修改成功,否则失败(像整体的修改无法确切决定局部的修改);

文档来源:mysql的union、left join、 right join、 inner join和视图学习