视图是存储,在调用的时候产生一个结果集的查询。一个视图作为一个虚拟表。
简单理解:视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 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语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。
更新和插入的观点:
一些视图是可更新的,对它们的引用可以用来指定要更新的表中数据变化报表。那就是,你可以使用它们的报表等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
查询语句
删除视图:
删除视图只是删除视图的定义,并不会删除基表的数据。文章来源:https://www.toymoban.com/news/detail-471310.html
DROP VIEW IF EXISTS 视图名称;
总结
点赞加收藏是我最大的动力!文章来源地址https://www.toymoban.com/news/detail-471310.html
到了这里,关于【MySQL视图】视图处理算法 , 创建 {单表,多表,视图中创建视图},查看,和修改。最详细来这里!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!