当前位置:网站首页>一个案例理解mysql视图
一个案例理解mysql视图
2022-07-27 16:12:00 【zkkkkkkkkkkkkk】
目录
一、什么是视图?
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
六、总结
关于视图的操作(删改查),后续会专门再记录一篇。
边栏推荐
- [MIT 6.S081] Lab 5: xv6 lazy page allocation
- Solution to invalid SQL Server connection to server
- [mit 6.s081] LEC 6: isolation & system call entry/exit notes
- Deep learning: a survey of behavior recognition
- 2021.7.28笔记 事务
- MySQL学习 Day1 DDL、DML、DQL基础查询
- @Convert 注解在jpa中进行查询的注意事项
- [MIT 6.S081] Lab 4: traps
- 2021.7.19笔记 DML
- Nowcoder (5 choices)
猜你喜欢

2021.7.19 notes DML
![[MIT 6.S081] Lab 10: mmap](/img/5d/a59a6f723518553b9232bc09991075.png)
[MIT 6.S081] Lab 10: mmap
![[mit 6.s081] LEC 5: calling conventions and stack frames risc-v notes](/img/1f/6384f4831718477f0567540250f352.png)
[mit 6.s081] LEC 5: calling conventions and stack frames risc-v notes

Let's move forward together, the 10th anniversary of Google play!

多表查询

深度识别:论文阅读_2S-AGCN CVPR2019(基于骨架的动作识别的两流自适应图卷积网络)
![[MIT 6.S081] Lab 6: Copy-on-Write Fork for xv6](/img/ca/e8c0827b13805c7c74cc41bf84c6ff.png)
[MIT 6.S081] Lab 6: Copy-on-Write Fork for xv6

Visual Studio Code安装教程(超详细)

3. Opencv geometric transformation

2021.8.7笔记 servlet
随机推荐
C杂讲 链表初讲
[MIT 6.S081] Lab8: locks
[MIT 6.S081] Lab 11: networking
[MIT 6.S081] Lab 5: xv6 lazy page allocation
Deep learning: GCN case
[MIT 6.S081] Lec 4: Page tables 笔记
JDBC学习 Day1:JDBC
深度学习-视频行为识别:论文阅读——双流网络(Two-stream convolutional networks for action recognition in videos)
Solve the problem that reids cannot be accessed by other IPS
3. opencv几何变换
数据库的常用命令2
Nowcoder (5 choices)
1. OpenCV image basic operation
浅谈AI深度学习的模型训练和推理
MySQL学习 Day3 多表查询 / 事务 / DCL
2021.8.9 note request
[MIT 6.S081] Lab8: locks
[MIT 6.S081] Lab 10: mmap
[MIT 6.S081] Lab 3: page tables
[MIT 6.S081] Lec 9: Interrupts 笔记