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

  • Post author:
  • Post category:mysql




视图

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


简单理解:

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



前言



视图优点




1. 操作简单

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


2. 减少数据冗余

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


3. 数据安全

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


4. 适应灵活多变的需求

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


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

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


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


这个


CREATE VIEW


语句创建新的视图。改变视图的定义或删除视图,使用


ALTER VIEW


,或


DROP VIEW



一个视图可以从多种创建


SELECT


声明.它可以指基表或其他视图。它可以使用联接,


UNION


和子查询。the


SELECT


甚至不需要参考任何表。下面的示例定义一个视图,选择从另一桌两列,以及从这些列的计算表达式:

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语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。

更新和插入的观点:

一些视图是可更新的,对它们的引用可以用来指定要更新的表中数据变化报表。那就是,你可以使用它们的报表等


UPDATE





DELETE


,或


INSERT


更新基础表的内容。派生表、公用表表达式也可以在多个表中指定的


UPDATE





DELETE


报表,但只能用于读取数据指定要更新或删除的行。一般来说,视图的引用必须是可更新的,这意味着他们可以合并和不实。复合视图有更复杂的规则。

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

  • 聚合函数和窗口函数(


    SUM()





    MIN()





    MAX()





    COUNT()


    我知道,和四)


  • DISTINCT


  • GROUP BY


  • HAVING



  • UNION





    UNION ALL

  • 选择列表中的子查询

    独立的子查询选择列表中的失败


    INSERT


    ,但都好


    UPDATE





    DELETE


    。相关子查询的选择列表中,没有数据变化报表允许。

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

  • 参考在nonupdatable观

    FROM

    条款

  • 子查询中的

    WHERE

    条款,是指一个表中



    条款

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


  • ALGORITHM = TEMPTABLE

    (使用一个临时表总是认为nonupdatable)

  • 多个引用任何一个基表列(失败


    INSERT


    ,好了


    UPDATE





    DELETE


  • 对于多表视图是可更新,它有时是可能的,假设它可以处理的

    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 视图名称;



总结

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



版权声明:本文为duanjiacheng5015原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。