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. 能够分解复杂的查询逻辑

不足:

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

相关推荐
CodeJourney.3 分钟前
利用DeepSeek实现文档到流程图的高效转换:技术应用与实践探索
数据库·人工智能·算法·excel·流程图
Arbori_262151 小时前
Oracle 分析函数(Analytic Functions)
数据库·oracle
notfindjob1 小时前
QT Sqlite数据库-教程002 查询数据-上
数据库
那天的烟花雨1 小时前
android display 笔记(十一)surfaceflinger 如何将图层传到lcd驱动的呢?
android·笔记
你说你说你来说1 小时前
安卓开发Intent详细介绍和使用
android·笔记
猫咪-95271 小时前
数据库原理及应用mysql版陈业斌实验三
java·数据库·sql
jingjingjing11111 小时前
笔记:代码随想录算法训练营day67:Floyd 算法精讲、A * 算法精讲 (A star算法) 严重超时完结,不过,撒花
笔记
zhuyixiangyyds2 小时前
day28图像处理OpenCV
图像处理·笔记·学习
TDengine (老段)2 小时前
TDengine 语言连接器(Go)
大数据·数据库·物联网·golang·时序数据库·tdengine·iotdb
加油,旭杏2 小时前
【Redis】数据结构和内部编码
数据库·redis·缓存