目录
一、什么是视图?
mysql的视图是一个虚拟存在的表,它既有着真实存在表的功能,又不占用空间,视图又可以认为是特定的sql语句。视图的存在其实就是帮助我们达到快速查找我们想要的内容。那么问题来了,为什么我说视图又可以认为是特定的sql语句呢?下面一个案例解释一下。
二、案例问题
举个例子,现在有三张表:student、teacher、course三张表,分别代表的是学生信息表、讲师信息表、课程信息表。好,那么问题来了,如果我们想看到张三同学的讲师以及课程信息,这时我们需要关联三张表去做查询。当然如果这个查询动作是n次的。也就是说这次这个老师要查询张三的信息,下次那个老师要查询李四的信息。我们不难想象这样存在的不便是需要每次重复写sql去做关联查询。这时候使用mysql的视图功能就能达到事半功倍的效果。
三、案例数据准备
针对上述案例,我们需要达到的目的是一次检索,不要那么多重复的动作。假设三张表中的数据如下所示:(建表及sql语句可以看这边博客:mysql基础语句增删改查)
假设student表数据如下:
s_id | s_name | t_id |
1 | 张三 | 3 |
2 | 李四 | 1 |
3 | 王五 | 2 |
其中:s_id为学生id、s_name为学生姓名、t_id为学生的讲师id(与讲师表中t_id对应)
假设teacher表数据如下:
t_id | t_name | c_id |
1 | 张老师 | 1 |
2 | 李老师 | 2 |
3 | 王老师 | 3 |
其中:t_id为讲师id、t_name为讲师姓名、c_id为讲师所教课程id(与课程表中c_id对应)
假设course表数据如下:
c_id | c_name |
1 | 语文 |
2 | 数学 |
3 | 英语 |
其中c_id为课程id、c_name为课程名称
四、普通查询与视图查询
根据案列问题,我们如果需要查询张三的信息需要关联三张表,具体sql语句如下:
select c.s_name,c.t_name,d.c_name
from
(
-- 关联学生表和讲师表,取出学生姓名、讲师姓名、课程id
select a.s_name,b.t_name,b.c_id
from
(
select s_name,t_id
from student
) a
inner join
(
select t_id,t_name,c_id
from teacher
) b
on a.t_id = b.t_id
) c
inner join
(
-- 课程表 与上述结果关联通过课程id
select c_id,c_name
from course
) d
on c.c_id=d.c_id
where c.s_name = '张三'
可以看到,如果不同讲师查询不同学生的信息,需要同上相同的重复的查询。如果使用视图的话会是怎么样的呢?我们先创建一个这样的视图。(记住我说的视图又可以看成一条sql语句)
创建上述案例视图
-- sms 为学生信息系统(student message system)首字母缩写组成
create view sms as
select c.s_name,c.t_name,d.c_name
from
(
-- 关联学生表和讲师表,取出学生姓名、讲师姓名、课程id
select a.s_name,b.t_name,b.c_id
from
(
select s_name,t_id
from student
) a
inner join
(
select t_id,t_name,c_id
from teacher
) b
on a.t_id = b.t_id
) c
inner join
(
-- 课程表 与上述结果关联通过课程id
select c_id,c_name
from course
) d
on c.c_id=d.c_id
执行完上述代码后我们可以发现,创建了一张虚拟的表,将上述的结果存进去了(虚拟的并不是真正意义上的存)。这样的好处就是,如果不同的讲师查询不同学生的信息时候,我们不需要每次繁琐的拼接,只需针对这张虚拟的视图表进行查询。而查询视图也相当于执行了上述的所有代码,所以说视图也可以认为是一条sql语句。
五、使用视图须知
①:视图的命名具有唯一性
②:视图的创建数目没有限制
③:视图没有索引
④:视图可以嵌套视图
⑤:视图可以和真实的表进行join
六、总结
关于视图的操作(删改查),后续会专门再记录一篇。