【MySQL视图】视图处理算法 , 创建 {单表,多表,视图中创建视图},查看,和修改。最详细来这里!

视图是存储,在调用的时候产生一个结果集的查询。一个视图作为一个虚拟表。

简单理解:视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念。视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。

 

前言

 视图优点
1. 操作简单

将经常使用的查询操作定义为视图,可以使开发人员不需要关心视图对应的数据表的结构、表与表之间的关联关系,也不需要关心数据表之间的业务逻辑和查询条件,而只需要简单地操作视图即可,极大简化了开发人员对数据库的操作。

2. 减少数据冗余

视图跟实际数据表不一样,它存储的是查询语句。所以,在使用的时候,我们要通过定义视图的查询语句来获取结果集。而视图本身不存储数据,不占用数据存储的资源,减少了数据冗余。

3. 数据安全

MySQL将用户对数据的 访问限制 在某些数据的结果集上,而这些数据的结果集可以使用视图来实现。用户不必直接查询或操作数据表。这也可以理解为视图具有 隔离性 。视图相当于在用户和实际的数据表之间加了一层虚拟表。同时,MySQL可以根据权限将用户对数据的访问限制在某些视图上,用户不需要查询数据表,可以直接通过视图获取数据表中的信息。这在一定程度上保障了数据表中数据的安全性。

4. 适应灵活多变的需求

当业务系统的需求发生变化后,如果需要改动数据表的结构,则工作量相对较大,可以使用视图来减少改动的工作量。这种方式在实际工作中使用得比较多。

5. 能够分解复杂的查询逻辑

数据库中如果存在复杂的查询逻辑,则可以将问题进行分解,创建多个视图获取数据,再将创建的多个视图结合起来,完成复杂的查询逻辑。

 


一、创建视图{单表,多表,视图中创建视图}

这个CREATE VIEW语句创建新的视图。改变视图的定义或删除视图,使用ALTER VIEW,或DROP VIEW

一个视图可以从多种创建SELECT声明.它可以指基表或其他视图。它可以使用联接,UNION和子查询。theSELECT甚至不需要参考任何表。下面的示例定义一个视图,选择从另一桌两列,以及从这些列的计算表达式:

CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名称 [(字段列表)]
AS 查询语句
[WITH [CASCADED|LOCAL] CHECK OPTION]

 简单表达式

CREATE VIEW 视图名称
AS 查询语句

 创建多表联合视图:

就是在视图中的查询语句添加多表查询,自然连接或者USING连接,函数等。

类如:WHERE

CREATE VIEW empview
AS
SELECT employee_id emp_id,last_name NAME,department_name
FROM employees e,departments d
WHERE e.department_id = d.department_id;

左外连接

CREATE VIEW emp_dept
AS
SELECT ename,dname
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did;

 聚合函数

CREATE VIEW dept_sum_vu
(name, minsal, maxsal, avgsal)
AS
SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name;

 利用视图对数据进行格式化:

我们经常需要输出某个格式的内容,比如我们想输出员工姓名和对应的部门名,对应格式为
emp_name(department_name),就可以使用视图来完成数据格式化的操作:

CREATE VIEW emp_depart
AS
SELECT CONCAT(last_name,'(',department_name,')') AS emp_dept
FROM employees e JOIN departments d
WHERE e.department_id = d.department_id

 运行后:

二、查看视图

        语法1:查看数据库的表对象、视图对象

SHOW TABLES;

        语法2:查看视图的结构

DESC / DESCRIBE 视图名称;

        语法3:查看视图的属性信息

# 查看视图信息(显示数据表的存储引擎、版本、数据行数和数据大小等)
SHOW TABLE STATUS LIKE '视图名称'G

1.更新视图的数据

*一般情况*

MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。

更新和插入的观点:

一些视图是可更新的,对它们的引用可以用来指定要更新的表中数据变化报表。那就是,你可以使用它们的报表等UPDATEDELETE,或INSERT更新基础表的内容。派生表、公用表表达式也可以在多个表中指定的UPDATEDELETE报表,但只能用于读取数据指定要更新或删除的行。一般来说,视图的引用必须是可更新的,这意味着他们可以合并和不实。复合视图有更复杂的规则。

一个视图是可更新的,必须有一个一对一的关系排在视图和基础表中的行。也有一些其他的结构,使视图nonupdatable。更具体的,如果它包含下列视图是不可更新的:

  • 聚合函数和窗口函数(SUM()MIN()MAX()COUNT()我知道,和四)

  • DISTINCT

  • GROUP BY

  • HAVING

  • UNIONUNION ALL

  • 选择列表中的子查询

    独立的子查询选择列表中的失败INSERT,但都好UPDATEDELETE。相关子查询的选择列表中,没有数据变化报表允许。

  • 某些连接(见附加在本节稍后加入讨论)

  • 参考在nonupdatable观FROM条款

  • 子查询中的WHERE条款,是指一个表中条款

  • 仅指文字值(在这种情况下,没有基本表的更新)

  • ALGORITHM = TEMPTABLE(使用一个临时表总是认为nonupdatable)

  • 多个引用任何一个基表列(失败INSERT,好了UPDATEDELETE

  • 对于多表视图是可更新,它有时是可能的,假设它可以处理的MERGE算法.对于这个工作,视图必须使用内部联接(不是外部联接或UNION)。另外,在视图定义中只有一个表可以被更新,所以配置条款名称仅列必须从一个视图中的表。视图的使用UNION ALL不允许他们虽然在理论上可能更新。

  • 关于嵌入性(被更新与INSERT语句),如果它也满足这些额外的要求可更新视图的视图列插入:

  • 不能有重复的视图列的名字。

  • 视图必须包含在基表中,没有默认值的所有列。

  • 视图的列必须是简单的列引用。

2.修改、删除视图

修改视图
方式1:使用CREATE OR REPLACE VIEW 子句修改视图

CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS
SELECT employee_id, first_name || ' ' || last_name, salary, department_id
FROM employees
WHERE department_id = 80;

说明:CREATE VIEW 子句中各列的别名应和子查询中各列相对应。

 方式2:ALTER VIEW
修改视图的语法是:

ALTER VIEW 视图名称
AS
查询语句

删除视图:
        删除视图只是删除视图的定义,并不会删除基表的数据。

DROP VIEW IF EXISTS 视图名称;

总结

点赞加收藏是我最大的动力!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>