【第十八部分】视图

【第十八部分】视图



18. 视图

18.1 什么是视图?

对于视图的理解: 我们可以把他看作一个虚拟表,本身是不存储数据的!!!,视图的本质其实就像存储起来的SELECT语句, 视图中SELECT语句中所涉及到的表叫做 ‘基表’

视图特性: 对视图做DML操作,会影响对应对应基表中的数据,反之,在基表中进行操作同样会影响视图; 视图本身的删除,是不会导致基表中的数据删除.

举个实际的应用场景能够更好的去理解视图:

在实际开发场景中,数据库中有很多的字段,例如:用户的邮箱,用户的电话号码等等私密的信息是需要隐藏的,那么这个时候就可以利用视图解决这个问题, 有的人会说,那么我创建一个去除私密信息的子表不可以吗? 但是创建出来的子表和之前的表是没有关联的,这样会导致如果用户的信息发生变更,那么需要改很多的子表.

视图的优点:

  1. 操作简单,可以将经常使用的查询操作定义为视图
  2. 保障数据安全视图, 相当于在用户和实际的数据表之间加了一层虚拟表。
  3. 能够分解复杂的查询逻辑, 创建多个视图获取数据,在进行结合,完成复杂的逻辑
  4. 适应灵活多变的需求

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有会失败的原因是:

  1. 视图所展现出来的字段只是基表的一部分,当我们进行插入的时候,其他字段是没有进行赋值的,也就是为NULL,但基表中有些字段是有约束条件不能为NULL值,这个时候就会导致插入失败
  2. 在视图中使用了JOIN联合查询,视图将不在支持插入和删除操作
  3. 定义视图的SELECT语句后的字段列表中使用了数学表达式子查询,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值
  4. 在定义视图的SELECT语句后的字段列表中使用DISTINCT聚合函数GROUP BYHAVINGUNION等,视图将不支持INSERT、UPDATE、DELETE
  5. 定义视图的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 视图的缺点

在数据表的基础上创建了视图,那么,如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护, 特别是嵌套的视图(就是在视图的基础上创建视图)维护会变得比较复杂, 容易变成系统的潜在隐患.

实际项目中,如果视图过多,会导致数据库维护成本的问题。

所以,在创建视图的时候,需要结合实际项目需求,综合考虑视图的优点和不足,这样才能正确使用视图,使系统整体达到最优。


总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值