九、MYSQL8数据库视图

什么是视图?

个人的理解:数据库视图就是把一段子查询创建一个快捷方式.
视图是保存查询的结果,把查询的结果当做一张虚拟的表,视图依赖于原始的表数据和结构,如果原来的表数据或者结构发生了改变,视图的结构和数据也会发生相应改变。
在这里插入图片描述

在这里插入图片描述


数据库视图的特点:

  • 简化代码
  • 安全性,可以指定展示其中某几列数据,隐藏敏感信息
    在这里插入图片描述

视图常见用法

在这里插入图片描述
在这里插入图片描述


创建视图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

-- 创建视图语法结构
-- or replace如果视图存在则替换
CREATE or replace
VIEW 视图名 AS SQL查询语句;

-- 创建视图示例
CREATE VIEW ShowStu AS SELECT * FROM student;

创建视图时指定字段名

-- 创建视图时指定字段名
CREATE VIEW view_show_stu (sid,sname,sex,birth,classid) AS SELECT * FROM student;

创建多表视图

-- 创建多表视图
CREATE VIEW Get_student_score AS SELECT student.sno,student.sname,student.ssex,student.sbirthday,student.class,score.cno,score.degree FROM student,score WHERE student.sno = score.sno

修改视图

在这里插入图片描述

-- 修改视图语法结构:	
ALTER VIEW 视图名 AS 新的查询sql

-- 修改视图示例
ALTER VIEW showstu AS SELECT student.sno,student.sname,student.ssex,student.sbirthday,student.class,score.cno,score.degree FROM student,score WHERE student.sno = score.sno

从视图更新数据–强烈不建议

视图的目的是为了使查询语句更易读,而不是为了写入数据。生产环境下禁止更新视图
在这里插入图片描述
在这里插入图片描述

不可更新的:

  • 聚合函数
  • DISTINCT去重后的结果
  • GROUP BY
  • HAVING
  • UNION或UNION ALL
  • 位于选择列表中的子查询
  • JOIN
  • FROM子句中的不可更新视图
  • WHERE子句中的子查询,引用FROM子句中的表
  • 仅引用文字值(在该情况下,没有要更新的基本表)
    在这里插入图片描述
    在这里插入图片描述

重命名视图

在这里插入图片描述

-- 重命名视图
reanme table 修改前视图名 to 修改后视图名;

删除视图

在这里插入图片描述

-- 删除视图
DROP VIEW  IF EXISTS 视图名;

视图的约束

在这里插入图片描述


WITH LOCAL CHECK OPTION

WITH LOCAL CHECK OPTION:该选项确保在插入更新行时,仅限于符合视图定义条件的那些行。如果尝试插入或更新违反此条件的行,则将拒绝该操作

例如
以下视图只包含性别男性的员工:
如果尝试插入一个性别女性的员工,则该操作将被拒绝

CREATE VIEW male_employees AS
SELECT *
FROM employees
WHERE gender = 'M'
WITH LOCAL CHECK OPTION;

WITH CASCADE CHECK OPTION

WITH CASCADE CHECK OPTION:该选项确保在插入更新行时,不仅限符合视图定义条件的那些,而且还限制所有与该视图有关。如果尝试插入或更新违反这些条件,则将拒绝该操作。

例如
以下视图包含名字以“S”开头的员工及其所在的部门:
如果尝试插入一个名字不以“S”开头的员工并将其分配到已存在的部门,则该操作将被拒绝。

# 创建一个视图,只查询包含名字以“S”开头的员工及其所在的部门
CREATE VIEW s_员工部门 AS
SELECT e.*, d.部门名称
FROM 员工表 AS e
JOIN 部门表 d ON e.部门编号 = d.部门编号
WHERE e.名字 LIKE 'S%'
WITH CASCADE CHECK OPTION;

视图安全验证方法

MySQL 8 视图中的 InvokerDefiner 控制了视图的访问权限,分别基于使用视图的用户视图的创建者权限进行控制。在创建视图时,可以使用 SQL SECURITY 指定所需的访问控制级别。
在这里插入图片描述


definer定义者权限

在 MySQL 8 视图中,definer 表示视图的创建者或所有者。在创建视图时,可以使用 definer 指定视图的创建者,也可以使用 CURRENT_USER() 函数指定当前登录用户作为视图的创建者。创建视图的用户具备访问表的权限,同时视图的访问权限受到创建者角色的限制。在执行视图查询时,MySQL服务器会使用创建者的权限去访问底层表,以此来保护数据的安全性。

假设我们有一个名为employees的表,其中包含有关员工薪水的信息。现在我们想要创建一个只包含经理信息的视图,并将视图的创建者设置为 “admin” 用户。

示例代码:
在这里插入图片描述
在这里插入图片描述

定义了一个名为managers视图,并将其设置为仅包含 title 字段值为 "Manager" 的记录。此外,我们还指定了 WITH CHECK OPTION,这将确保任何针对视图的 INSERTUPDATEDELETE 操作都必须符合筛选条件。最后,我们使用 SQL SECURITY DEFINER指定视图的访问权限是基于其创建者的权限进行控制的,并使用 DEFINDER 关键字将视图的创建者设置为 "admin@localhost"

CREATE VIEW managers AS 
SELECT * FROM employees 
WHERE title = 'Manager' 
WITH CHECK OPTION 
SQL SECURITY DEFINER 
DEFINER = 'admin@localhost';

invoker调用者权限

MySQL8 视图中的 Invoker 是指使用视图的用户。与 Definer 不同,Invoker 将使用自己的权限执行对视图的查询,而不是使用视图的创建者的权限。当视图创建时,如果使用 SQL SECURITY INVOKER指定视图的访问控制,则视图将基于当前用户的权限进行访问控制。如果没有指定 SQL SECURITY 选项,则默认使用 SQL SECURITY DEFINER,这意味着视图将基于视图的创建者的权限进行访问控制。

示例代码:
在这里插入图片描述
在这里插入图片描述

假设我们有两个表 employeessalaries,其中 employees 表包含有关员工详细信息salaries 表包含有关员工薪水的信息。现在我们要在这两个表之间建立一个视图,并将其设置仅显示工资大于等于10000的所有员工,并将视图访问控制权限设置为基于当前用户权限

定义了一个名为 high_paid_employees视图,并将其设置为仅包含工资大于等于10000的员工记录。使用 SQL SECURITY INVOKER 可以将该视图访问控制设置为基于当前用户的权限进行控制

# 将该视图的访问控制设置为基于当前用户的权限进行控制。
CREATE VIEW high_paid_employees AS 
SELECT e.*, s.salary FROM employees e 
JOIN salaries s ON e.emp_no = s.emp_no 
WHERE s.salary >= 10000 
WITH CHECK OPTION 
SQL SECURITY INVOKER;

检测视图

当视图引用的对象,比如表,列,视图,不存在时,视图变为不可用的,使用check table 视图名;可以检测视图的可用性

-- 检测视图的可用性
check table 视图名;

在这里插入图片描述


查看视图


查看视图结构

# 查看表和视图
show full tables;

在这里插入图片描述

-- 查看视图结构
DESC 视图名 \G;

查看创建视图的预计

-- 查看创建视图的预计
SHOW CREATE VIEW 视图名 \G;

在这里插入图片描述


查看视图的元数据

-- 使用information_schema查看元数据
-- table_schema是数据库的名称
SELECT * FROM information_schema,views WHERE table_schema='表名' AND table_name='视图名或表名'\G

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值