目录
- 一、什么是视图
- 二、视图语法
- 三、检查选项
- (1) cascaded(级联)
- (2) local
- 四、视图的作用
- 五、视图案例
一、什么是视图
- 视图(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 提供了两个选项: CASCADED 和 LOCAL,默认值为 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);
学习笔记基于黑马程序员的课程,阿里嘎多