视图的理解
①视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 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. 能够分解复杂的查询逻辑
不足:
如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护 。