一、什么是视图
- 视图(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);
学习笔记基于黑马程序员的课程,阿里嘎多