Mysql(八) --- 视图


前言

前面我们学习了索引,这次我们来学习视图


1.什么是视图?

视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。

2.创建视图

语法:

create view view_name [(column_list)] as select_statement

3. 使用视图

例如:查询用户的所有信息和考试成绩

select s.student_id,s.name,cls.class_id,cls.name,c.course_id,c.name,sc.score
from student s,class cls,course c,score sc
where s.class_id = cls.class_id
and sc.student_id = s.student_id
and sc.course_id = c.course_id
order by s.student_id;

在这里插入图片描述
所有有这样开发需求的程序员,都需要写这么复杂的SQL,为此我们为上面建立一个视图。

create view v_student_score as(
select s.student_id,s.name,cls.class_id,cls.name,c.course_id,c.name,sc.score
from student s,class cls,course c,score sc
where s.class_id = cls.class_id
and sc.student_id = s.student_id
and sc.course_id = c.course_id
order by s.student_id
);

在这里插入图片描述
改进的语句:

create view v_student_score as(
select 
s.student_id,
s.name as student_name,
cls.class_id,
cls.name as class_name,
c.course_id,
c.name as course_name,
sc.score
from student s,class cls,course c,score sc
where s.class_id = cls.class_id
and sc.student_id = s.student_id
and sc.course_id = c.course_id
order by s.student_id
);

使用视图

select * from v_student_score;

在这里插入图片描述
为了解决上面出现重复列的问题,也可以在视图中指定列名

create view v_student_score_v1
(id,name,class_id,class_name,course_id,course_name,score)
 as(
select s.student_id,s.name,cls.class_id,cls.name,c.course_id,c.name,sc.score
from student s,class cls,course c,score sc
where s.class_id = cls.class_id
and sc.student_id = s.student_id
and sc.course_id = c.course_id
);

在这里插入图片描述

4. 修改数据

  • 通过真实表修改数据,会影响视图

在这里插入图片描述
将上面的数据改为 99,并观察视图的数据

update score set score = 99 where student_id = 1 and course_id = 1;

在这里插入图片描述

select * from score;
select * from v_student_score order by id;

在这里插入图片描述

  • 通过视图修改数据会影响基表
    如果修改视图中的数据,会影响基表吗?
select * from v_student_score;

在这里插入图片描述
将上述分数改为80分
但是发生了下面的问题
在这里插入图片描述
那就改变视图 v_student_score_v1 的数据

update v_student_score_v1 set score where id = 1;

在这里插入图片描述观察视图和基础表的数据

select * from v_student_score_v1 order by id asc;

在这里插入图片描述

select * from score where student_id = 1;

在这里插入图片描述
因此,不论更新了视图还是基础表,都会相互被影响,查询出来的数据都是最新结果

4.1.注意事项

  • 修改真实表会影响视图,修改视图同样也会影响真实表
  • 以下视图不可更新
    • 创建视图时使用聚合函数的视图
    • 创建视图时使用distinct
    • 创建视图时使用GROUP BY 以及HAVING子句
    • 创建视图时使用UNIONUNION ALL
    • 查询列表中使用子查询
    • 在FROM子句中引用不可更新视图

5. 删除视图

drop view view_name;

6.视图的优点

1.简单性: 视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑。
2. 安全性: 通过视图,可以隐藏表中的敏感数据。例如,一个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
3. 逻辑数据独立性: 视图提供了一种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦
4. 重命名列: 视图允许用户重命名列名,以增强数据的可读性


### MySQL 视图的基本概念 视图(View)是一种虚拟表,其内容由查询定义[^2]。尽管它看起来像真实存在的表,但实际上并没有实际存储数据值集合。当访问视图时,底层会通过执行定义该视图的 `SELECT` 查询来动态生成所需的数据。 #### 视图的特点 - **虚拟性**:视图不占用物理空间,仅保存定义它的 SQL 查询语句。 - **安全性**:可以限制用户只查看特定字段或记录,从而保护敏感数据[^3]。 - **简化复杂查询**:可以通过创建视图隐藏复杂的联结或多层嵌套逻辑,使后续查询更加简单直观。 - **一致性维护**:即使基础表发生变化,只要不影响视图定义的有效性,基于此视图的操作仍然有效[^4]。 --- ### 创建视图的方法 创建视图的核心语法如下: ```sql CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]; ``` 以下是各部分参数的具体含义: - **`CREATE OR REPLACE`**:如果已存在相同名称的视图,则覆盖原视图- **`ALGORITHM`**:指定视图实现方式,默认为未定义 (`UNDEFINED`);可以选择合并模式 (`MERGE`) 或临时表模式 (`TEMPTABLE`)- **`DEFINER` 和 `SQL SECURITY`**:控制谁有权调用以及如何验证权限。 - **`view_name`**:新视图的名字。 - **`column_list`**:可选项,用来显式声明返回列名。 - **`select_statement`**:构建视图的基础查询语句。 - **`CHECK OPTION`**:确保任何针对视图所做的更改都符合原始查询条件。 下面给出一个简单的例子说明如何建立视图: ```sql -- 建立名为v_employee基本信息展示视图 CREATE VIEW v_employee AS SELECT employee_id, first_name, last_name, department_id FROM employees; ``` 以上命令将从员工表(`employees`)提取四个主要字段形成一个新的视角供以后查阅使用[^2]。 --- ### 使用视图进行查询 一旦建立了视图之后,就可以如同对待常规表格那样对其进行读取操作了。例如继续沿用上面的例子: ```sql SELECT * FROM v_employee WHERE department_id = 90; ``` 这条指令将会筛选出部门编号等于90的所有雇员详情[^4]。 值得注意的是,由于视图依赖于底层数椐源的变化而自动调整显示结果,因此无需额外同步工作即可反映最新状态[^3]。 --- ### 更新与删除视图 除了能够利用视图检索资料外,在某些情况下还可以经由它们完成更新或者移除动作。不过这取决于初始设计时候是否允许此类行为发生,并且要遵循一定的约束规则比如启用 WITH CHECK OPTION 参数等设置。 举个实例演示怎样借助先前设定好的视图去改变某条记录的信息: ```sql UPDATE v_employee SET last_name='Smith' WHERE employee_id=102; ``` 最后别忘了清理不再需要的对象以免造成混乱: ```sql DROP VIEW IF EXISTS v_employee; ``` --- ### 总结 综上所述,MySQL 中的视图提供了一种灵活机制帮助我们更好地管理和交互数据库资源。无论是为了提升用户体验还是加强信息安全防护方面都有不可替代的作用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值