【MySQL 数据库】8、视图

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDSClaw,2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 【MySQL 数据库】8、视图


一、什么是视图

  • 视图(View)是一种虚拟存在的表
  • 视图中的数据并不在数据库中真实存在
  • 行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的

二、视图语法

--- 创建视图
CREATE 
  OR REPLACE VIEW student_view AS SELECT
  id,
  `name`,
  money 
FROM
  student;
  
--- 查看视图的创建语句
show create view student_view;
--- 查看视图中的数据
select * from student_view;
select * from student_view where id <= 10;
--- 修改视图
create or replace view student_view as select id, `name` from student;
alter view student_view as select id, `name`, money from student;
--- 删除视图
drop view if exists student_view;

三、检查选项

当使用 WITH CHECK OPTION 子句创建视图时,MySQL 会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。

MySQL 允许基于一个视图创建另一个视图,它还会检查依赖视
图中的规则以保持一致性

为了确定检查的范围,MySQL 提供了两个选项: CASCADEDLOCAL,默认值为 CASCADED

🍀 没有添加 with check option 的时候是直接插入,不做校验


# ① 基于 student 表创建了一个视图
# ② 该视图没有添加【检查选项】
# ③ 当使用视图插入的数据不符合视图创建的条件(id <= 20)的时候,数据依然可以插入到 student 表中
create or replace view stu_v1 as select id, `name`, money from student where id <= 20;
select * from stu_v1;
# 没有检查 id 是否符合视图创建的条件(id <= 20)
insert into stu_v1 values (8, 'Happy', 66666);
# 没有检查 id 是否符合视图创建的条件(id <= 20)
# id 不符合视图创建的条件(id <= 20),但依然可以插入到 student 表中
# 但在 stu_v1 中是不存在该条记录的
insert into stu_v1 values (99, 'Nice', 88888);

(1) cascaded(级联)

当视图使用 WITH CASCADED CHECK OPTION WITH CHECK OPTION时,会循环检查视图的规则以及底层视图的规则

create or replace view stu_v1 as select id, `name`, money from student where id <= 20;
# 可插入到基表中, 可插入到 stu_v1 视图中
insert into stu_v1 values (8, 'eight', 88888); 
# 可插入到基表中, 【不】可插入到 stu_v1 视图中
insert into stu_v1 values (22, '22', 22222);
# 可插入到基表中, 可插入到 stu_v1 视图中
insert into stu_v1 values (20, '20', 20000);
# 基于 stu_v1 视图创建有检查选项的视图
create view stu_v2 as select id, `name`, money from stu_v1 where id >= 10 with cascaded check option;
insert into stu_v2 values (6, '6', 66666); # failed
insert into stu_v2 values (21, '21', 21111); # failed(不符合 stu_v1 视图的条件)
insert into stu_v2 values (15, '15', 15555); # OK
# 基于 stu_v2 视图创建【没有】检查选项的视图
create view stu_v3 as select id, `name`, money from stu_v2 where id <= 15;
insert into stu_v3 values (11, '11', 11111); # OK
insert into stu_v3 values(17, '17', 17000); # OK 
insert into stu_v3 values(28, '28888', 28888); # failed

(2) local

🌱 当视图使用 WITH LOCAL CHECK OPTION 时,会递归查找当前视图所依赖的视图是否有检查选项?

🌱 如果有,则检查;如果没有,就不检查

create or replace view stu_v1 as select id, `name`, money from student where id <= 20;
# 基于 stu_v1 视图创建有检查选项的视图
create or replace view stu_v2 as select id, `name`, money from stu_v1 where id >= 10 with local check option;
insert into stu_v2 values (6, '6', 66666); # failed
insert into stu_v2 values (21, '21', 21111); # OK
insert into stu_v2 values (15, '15', 15555); # OK
# 基于 stu_v2 视图创建【没有】检查选项的视图
create or replace view stu_v3 as select id, `name`, money from stu_v2 where id <= 15;
insert into stu_v3 values (9, '9', 99999); # failed
insert into stu_v3 values(17, '17', 17000); # OK 
insert into stu_v3 values(28, '28888', 28888); # OK

四、视图的作用

🌻 要使视图可更新,视图中的行与基表中的行必须存在一对一的关系


🌻 视图不仅可以简化用户对数据的理解,也可以简化它们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

🌻 数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据,有一定的权限控制作用。

🌻 视图可帮助用户屏蔽真实表结构变化带来的影响【数据独立】

五、视图案例

🔥 为了保证数据库表的安全性,开发人员在操作 tb_user 表时,只能看到的用户的基本字段(屏蔽手机号和邮箱两个字段)

CREATE 
  OR REPLACE VIEW user_basic_info_view AS SELECT
  id,
  `name`,
  profession,
  age,
  gender,
  `status`,
  createtime 
FROM
  tb_user;

🔥 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。

CREATE 
  OR REPLACE VIEW student_course_view AS (
SELECT
  s.id '学生编号',
  s.`name`,
  s.`no`,
  c.id '课程编号',
  c.`name` '课程名' 
FROM
  student s
  LEFT JOIN student_course sc ON sc.studentid = s.id
  LEFT JOIN course c ON c.id = sc.courseid 
  );

create table student(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
no varchar(10) comment '学号'
) comment '学生表';
insert into student values (null, '黛绮丝', '2000100101'),(null, '谢逊',
'2000100102'),(null, '殷天正', '2000100103'),(null, '韦一笑', '2000100104');
create table course(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '课程名称'
) comment '课程表';
insert into course values (null, 'Java'), (null, 'PHP'), (null , 'MySQL') ,
(null, 'Hadoop');
CREATE TABLE student_course (
id INT auto_increment COMMENT '主键' PRIMARY KEY,
studentid INT NOT NULL COMMENT '学生ID',
courseid INT NOT NULL COMMENT '课程ID',
CONSTRAINT fk_courseid FOREIGN KEY ( courseid ) REFERENCES course ( id ),
CONSTRAINT fk_studentid FOREIGN KEY ( studentid ) REFERENCES student ( id ) 
) COMMENT '学生课程中间表';
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),
(null,2,3),(null,3,4);

学习笔记基于黑马程序员的课程,阿里嘎多

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1271 152
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
946 156
|
7月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
7月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
7月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
7月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
505 158
|
7月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
531 156
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
635 161
|
8月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。

推荐镜像

更多
下一篇
开通oss服务