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

不足:

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

相关推荐
老邓计算机毕设1 小时前
SSM找学互助系统52568(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 毕业设计
痴儿哈哈1 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
洛豳枭薰1 小时前
Innodb一次更新动作
mysql
Σίσυφος19002 小时前
PCL法向量估计 之 方向约束法向量(Orientation Guided Normal)
数据库
老毛肚2 小时前
手写mybatis
java·数据库·mybatis
海山数据库2 小时前
移动云大云海山数据库(He3DB)postgresql_anonymizer插件原理介绍与安装
数据库·he3db·大云海山数据库·移动云数据库
云飞云共享云桌面2 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
2501_927993532 小时前
SQL Server 2022安装详细教程(图文详解,非常详细)
数据库·sqlserver
星火s漫天2 小时前
第一篇: 使用Docker部署flask项目(Flask + DB 容器化)
数据库·docker·flask
菩提小狗2 小时前
小迪安全2023-2024|第5天:基础入门-反弹SHELL&不回显带外&正反向连接&防火墙出入站&文件下载_笔记|web安全|渗透测试|
笔记·安全·web安全