视图
1. 为什么要有视图?
当我们频繁地使用用多表查询和复合查询出的结果时,就需要频繁的使用多表查询和复合查询。
能不能把多表查询和复合查询的结果呢储存起来呢?并且修改查询的内容时,对应表的内容也被修改呢?
为了解决这一问题,我们就应该学习视图了
2.视图的定义和特点
MySQL的视图(View)是一种虚拟表,其内容由查询定义。从本质上讲,视图并不是以存储数据的形式存在的实体表,而是根据定义视图时所使用的查询语句动态生成的一组数据。这意味着,当你查询视图时,MySQL实际上执行的是该视图背后定义的SQL查询语句,返回的数据是基于这些查询语句从一个或多个实际表中提取出来的。(第6结还会细讲)
视图的主要特点和优势包括:
- 简化查询:视图可以将复杂的查询语句封装起来,使用户能够以更简单的方式查询数据,特别是当涉及到多个表的联接操作时。
- 数据抽象:通过视图,可以隐藏表的真实结构,对外提供一个简化的数据接口,有助于保护数据库的实际设计。
- 增强安全性:可以创建视图来限制用户对表中某些敏感数据的访问,例如,只允许用户查看某些特定的列或行。
- 逻辑独立性:当底层表的结构发生变化时,通过调整视图的定义,可以保持应用程序不受影响,从而提高了系统的灵活性。
3. 创建视图
创建视图的语法如下:
CREATEVIEW view_name [(column_list)]AS select_statement
更新视图的语法:
UPDATE view_name
SET...[where...]
- column_list:可选参数,用于显式指定视图列的名称。
- select_statement:定义视图的SELECT查询语句。
4. 视图的使用举例
4.1 创建表并插入数据
创建表:
CREATETABLE students (
id INTAUTO_INCREMENTPRIMARYKEY,
name VARCHAR(100)NOTNULL,
age INTNOTNULL,
major VARCHAR(100));
插入数据:
INSERTINTO students (name, age, major)VALUES('Alice',20,'Computer Science'),('Bob',21,'Mathematics'),('Charlie',22,'Physics');
4.2 举例
- 创建视图,只需要
students
的name
列和major
列 命令:createview myview asselect name,major from students;
- 查询视图
select*from myview;
- 修改视图中的数据后查询基表
students
的数据update myview set name='alice'where name ='Alice';select*from students;
当修改视图中的数据时,基表的数据会改变。 - 修改基表
students
中的数据后查询的视图的数据update students set name='bob'where name ='Bob';select*from myview;
当修改基表的数据时,视图的数据会改变。
5. 视图和基表之间有什么联系呢?
从本质上讲,视图并不是以存储数据的形式存在的实体表,而是根据定义视图时所使用的查询语句动态生成的一组数据。这意味着,当你查询视图时,MySQL实际上执行的是该视图背后定义的SQL查询语句,返回的数据是基于这些查询语句从一个或多个实际表中提取出来的。
查询一下上面创建的视图
myview
在Linux中的的文件
# 进入MySQL中的test数据库目录
cd /var/lib/mysql/test
# 显示数据库中的文件ls
视图文件中存储的是什么呢?
打开
myview
文件,看一看什么:
vim myview.frm
这张图片显示了一个 MySQL 视图的详细信息,其中红色框内的内容是视图的定义查询语句。
这段 SQL 代码表示一个名为
students
的表,从中选择了
name
和
major
这两个字段,并分别给它们起了别名
name
和
major
。这个查询语句是创建视图时使用的原始 SQL 语句。
使用视图查询本质上是执行定义视图时的语句。
如:
# 创建一个视图createview myview asselect name, major from studnets;# 查询视图的内容select*from myview;# 实际上是执行select*fromselect`test`.`students`.`name`AS`name`,`test`.`students`.`major`AS`major`from`test`.`students`# 其实就是执行select name, major from students;
如果对视图进行怎删改查,其实就是对基表进行增删改查(MySQL内部自己操作),视图只是一个查询的结果。
版权归原作者 Code哈哈笑 所有, 如有侵权,请联系我们删除。