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

不足:

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

相关推荐
weisian15122 分钟前
Mysql--运维篇--备份和恢复(逻辑备份,mysqldump,物理备份,热备份,温备份,冷备份,二进制文件备份和恢复等)
运维·mysql
夏炎正好眠25 分钟前
mysql概述
数据库·mysql·oracle
m0_6786933334 分钟前
深度学习笔记11-优化器对比实验(Tensorflow)
笔记·深度学习·tensorflow
l1x1n038 分钟前
No. 31 笔记 | Web安全-SQL手工注入技术学习 Part 2
笔记·sql·web安全
get_money_42 分钟前
动态规划汇总1
开发语言·数据结构·笔记·算法·leetcode·动态规划·代理模式
众拾达人44 分钟前
旅游网站设计与实现
数据库·旅游
摇光~1 小时前
【数据仓库】— 5分钟浅谈数据仓库(适合新手)从理论到实践
大数据·数据库·数据仓库·spark·etl
三天不学习1 小时前
如何将 sqlserver 数据迁移到 mysql
数据库·mysql·sqlserver
wrjwww1 小时前
【MySQL学习笔记】MySQL的索引
笔记·学习·mysql
fengyehongWorld1 小时前
Oracle 终止正在执行的SQL
数据库·oracle