【第十八部分】视图
18. 视图
18.1 什么是视图?
对于视图的理解: 我们可以把他看作一个虚拟表,本身是不存储数据的!!!,视图的本质其实就像存储起来的SELECT语句, 视图中SELECT语句中所涉及到的表叫做 ‘基表’
视图特性: 对视图做DML操作,会影响对应对应基表中的数据,反之,在基表中进行操作同样会影响视图; 视图本身的删除,是不会导致基表中的数据删除.
举个实际的应用场景能够更好的去理解视图:
在实际开发场景中,数据库中有很多的字段,例如:用户的邮箱,用户的电话号码等等私密的信息是需要隐藏的,那么这个时候就可以利用视图解决这个问题, 有的人会说,那么我创建一个去除私密信息的子表不可以吗? 但是创建出来的子表和之前的表是没有关联的,这样会导致如果用户的信息发生变更,那么需要改很多的子表.
视图的优点:
- 操作简单,可以将经常使用的查询操作定义为视图
- 保障数据安全视图, 相当于在用户和实际的数据表之间加了一层虚拟表。
- 能够分解复杂的查询逻辑, 创建多个视图获取数据,在进行结合,完成复杂的逻辑
- 适应灵活多变的需求
18.2 创建视图
创建单表视图
# 语法
CREATE VIEW 视图名称 (可以理解为列的别名,别名,别名)
AS
SELECT 语句
CREATE VIEW v_emp1(e_id,e_name,e_salary)
AS
SELECT employee_id,last_name,salary
FROM employees;
# 查看视图
SELECT * FROM v_emp1;
创建多表联合视图
CREATE VIEW v_emp_dep(e_id,e_name,d_id,d_name)
AS
SELECT e.employee_id,e.last_name, d.department_id,d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
SELECT * FROM v_emp_dep;
基于视图创建视图
CREATE VIEW v_emp_dep2
AS
SELECT ve.e_id,ve.e_name,ve.e_salary,ved.d_id,ved.d_name
FROM v_emp_dep ved JOIN v_emp1 ve
ON ved.e_id = ve.e_id;
SELECT * FROM v_emp_dep2
18.3 查看视图
查看数据库的表对象和视图对象
SHOW TABLES;
查看视图的结构
DESC 视图名称;
查看视图的属性信息
SHOW TABLE STATUS LIKE '视图名称'\G;
查看视图的详细定义信息
SHOW CREATE VIEW 视图名称;
18.4 更新视图数据
MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表(基表)中的数据也会发生变化,反之亦然。
UPDATE 操作
UPDATE v_emp_dep2
SET e_salary = 8000
WHERE e_id = 202
DELETE和INSERT有会失败的原因是:
- 视图所展现出来的字段只是基表的一部分,当我们进行插入的时候,其他字段是没有进行赋值的,也就是为NULL,但基表中有些字段是有约束条件不能为NULL值,这个时候就会导致插入失败
- 在视图中使用了JOIN联合查询,视图将不在支持插入和删除操作
- 定义视图的SELECT语句后的字段列表中使用了
数学表达式
或子查询
,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值 - 在定义视图的SELECT语句后的字段列表中使用
DISTINCT
、聚合函数
、GROUP BY
、HAVING
、UNION
等,视图将不支持INSERT、UPDATE、DELETE - 定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持INSERT、UPDATE、DELETE
DELETE 操作
DELETE FROM v_emp1
WHERE e_id = 300
INSERT 操作
INSERT INTO v_emp1
VALUES (300,'test','jay','hello','456464.44','1998-02-12','IT_PROG',6000,null,201,20)
18.5 修改和删除视图
修改视图
# 第一种方式:
CREATE OR REPLACE VIEW v_emp1(e_id,e_name,email,salary)
AS
SELECT employee_id,last_name,email,salary
FROM employees
# 第二种方式:
ALTER VIEW v_emp1(e_id,e_name,email,salary)
AS
SELECT employee_id,last_name,email,salary
FROM employees
删除视图
DROP VIEW IF EXISTS 视图名称;
18.6 视图的缺点
在数据表的基础上创建了视图,那么,如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护, 特别是嵌套的视图(就是在视图的基础上创建视图),维护会变得比较复杂, 容易变成系统的潜在隐患.
实际项目中,如果视图过多,会导致数据库维护成本的问题。
所以,在创建视图的时候,需要结合实际项目需求,综合考虑视图的优点和不足,这样才能正确使用视图,使系统整体达到最优。
总结
以上就是今天要讲的内容,希望对大家有所帮助!!!