MySQL视图笔记

视图的理解

①视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念。

视图建立在已有表的基础上 , 视图赖以建立的这些表称为基表

③对视图中的数据进行增加删除和修改,对应的数据表(基表)中的数据会相应的发生变化,反之亦然。

④可以将视图理解为存储起来的select语句

⑤视图的创建与删除只影响视图本身不影响对应的基表

⑥视图的应用场景:小型项目,不建议使用;大型项目,考虑使用

⑦优点:简化查询;控制数据访问权限

视图的创建与查看

创建视图

①在 CREATE VIEW 语句中嵌入子查询

CREATE [OR REPLACE]

ALGORITHM = {UNDEFINED \| MERGE \| TEMPTABLE}

VIEW 视图名称 [(字段列表)]

AS 查询语句

WITH \[CASCADED\|LOCAL\] CHECK OPTION

②精简版

CREATE VIEW 视图名称

AS 查询语句

创建单表视图

说明1:实际上就是我们在 SQL 查询语句的基础上封装了视图 VIEW,这样就会基于 SQL 语句的结果集形成一张虚拟表。

说明2:在创建视图时,没有在视图名后面指定字段列表,则视图中字段列表默认和SELECT语句中的字段列表一致。如果SELECT语句中给字段取了别名,那么视图中的字段名和别名相同。

# 情况一:视图中的字段与基表的字段有对应关系

sql 复制代码
CREATE VIEW vu_emp1

AS

SELECT employee_id,last_name,salary

FROM emps;

#查询语句中字段的别名作为会作为视图中字段的名称出现

CREATE VIEW vu_emp2(emp_id,NAME,monthly_sal)#括号中是视图的字段名(与下面查询语句的字段一一对应)

AS

SELECT employee_id,last_name,salary

FROM emps;

# 情况二:视图中的字段在基表中可能没有对应的字段

sql 复制代码
CREATE VIEW vu_emp3

AS

SELECT department_id,AVG(salary) avg_sal

FROM emps

WHERE department_id IS NOT NULL

GROUP BY department_id;

创建多表联合视图

# 针对与多表(多表查询)

sql 复制代码
CREATE VIEW vu_emp_dept

AS

SELECT e.employee_id,e.department_id,d.department_name

FROM emps e JOIN depts d

ON e.department_id = d.department_id;

利用视图对数据进行格式化 ( 利用函数连接字段 )

我们经常需要输出某个格式的内容

sql 复制代码
CREATE VIEW vu_emp_dept1

AS

SELECT CONCAT(e.last_name,'(',d.department_id,')') emp_info

FROM emps e JOIN depts d

ON e.department_id = d.department_id;

SELECT * FROM vu_emp_dept1;

基于视图创建视图

当我们创建好一张视图之后,还可以在它的基础上继续创建视图

查看视图

语法1:查看数据库的表对象、视图对象

SHOW TABLES;

语法2:查看视图的结构

DESC / DESCRIBE 视图名称;

语法3:查看视图的属性信息

查看视图信息(显示数据表的存储引擎、版本、数据行数和数据大小等)

SHOW TABLE STATUS LIKE '视图名称'\G

语法4:查看视图的详细定义信息

SHOW CREATE VIEW 视图名称;

更新视图数据删除视图

更新视图

MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。

#更新视图的数据,会导致基表中数据的修改;同理,更新表中的数据也会导致视图中的数据的修改

不可更新的视图

①在定义视图的时候指定了"ALGORITHM = TEMPTABLE",视图将不支持INSERT和DELETE操作;

②视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;

③在定义视图的SELECT语句中使用了 JOIN联合查询 ,视图将不支持INSERT和DELETE操作;

④在定义视图的SELECT语句后的字段列表中使用了 数学表达式 或 子查询 ,视图将不支持INSERT,也

不支持UPDATE使用了数学表达式、子查询的字段值;

⑤在定义视图的SELECT语句后的字段列表中使用 DISTINCT 、 聚合函数 、 GROUP BY 、 HAVING 、

UNION 等,视图将不支持INSERT、UPDATE、DELETE;

举例:

sql 复制代码
#不能更新视图中的数据

UPDATE vu_emp3

SET avg_sal = 5000

WHERE department_id = 30;

#avg_sal 是emps表中没有的字段,表示平均工资,要是的30号部门的平均工资为5000

#则需要修改每个员工的工资使其平均工资为5000;所以修改不成功

⑥在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持

INSERT、UPDATE、DELETE;

⑦视图定义基于一个 不可更新视图 ;

⑧常量视图。

注意:视图作为虚拟表,主要用于方便查询,不建议更新视图数据,对视图数据的更改都是通过实际数据表里数据的操作来完成的。

修改视图

方式1:使用CREATE OR REPLACE VIEW 子句修改视图

说明:CREATE VIEW 子句中各列的别名应和子查询中各列相对应。

方式2:ALTER VIEW

修改视图的语法是:

ALTER VIEW 视图名称

AS

查询语句

举例:

sql 复制代码
#方式一:

CREATE OR REPLACE VIEW vu_emp1

AS

SELECT employee_id,last_name,salary,email

FROM emps;

#方式二:

ALTER VIEW vu_emp1

AS

SELECT employee_id,last_name,email,hire_date

FROM emps; 

删除视图

删除视图只是删除视图的定义,并不会删除基表的数据。

删除视图的语法是:

DROP VIEW IF EXISTS 视图名称;

说明:基于视图a、b创建了新的视图c,如果将视图a或者视图b删除,会导致视图c的查询失败。这样的视图c需要手动删除或修改,否则影响使用。

视图缺优点

优点:

1. 操作简单

2. 减少数据冗余

3. 数据安全

用户不需要查询数据表,可以直接通过视图获取数据表中的信息 。这在一定程度上保障了数据表中数据的安全性。

4. 适应灵活多变的需求

5. 能够分解复杂的查询逻辑

不足:

如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护

相关推荐
Zzz 小生30 分钟前
Claude Code学习笔记(四)-助你快速搭建首个Python项目
大数据·数据库·elasticsearch
黎宇幻生2 小时前
Java全栈学习笔记39
java·笔记·学习
nongcunqq4 小时前
abap 操作 excel
java·数据库·excel
rain bye bye4 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
冻咸鱼5 小时前
MySQL的配置
mysql·配置
遇印记6 小时前
大二java学习笔记:二维数组
java·笔记·学习
阿里云大数据AI技术6 小时前
云栖实录|MaxCompute全新升级:AI时代的原生数据仓库
大数据·数据库·云原生
不剪发的Tony老师6 小时前
Valentina Studio:一款跨平台的数据库管理工具
数据库·sql
weixin_307779137 小时前
在 Microsoft Azure 上部署 ClickHouse 数据仓库:托管服务与自行部署的全面指南
开发语言·数据库·数据仓库·云计算·azure
六元七角八分7 小时前
pom.xml
xml·数据库