MySQL学习笔记(14)--视图

·概念

view,一种由select指令组成的虚拟表

  • 视图是虚拟表,可以使用表管理(结构管理)
    • 为视图提供数据的表叫做基表
# 创建视图
create view 视图名字 as select指令;

# 访问视图:一般都是查询
select */字段名 from 视图名字;
  • 视图有结构,但不存储数据
    • 结构:select选择的字段
    • 数据:访问视图时执行的select指令

步骤

1、确定需要使用视图提供数据

  • 数据来源是多张表
  • 对外部系统提供数据支撑(保护基表数据)

2、使用视图

示例

1、需要对外提供一个学生详情的数据,经常使用:可以利用视图实现

# 对外提供数据,要保护数据本身的安全
# 需要长期使用

# 创建视图
create view v_student_info as select * from my_student s left join my_class c on s.class_id = c.id;
# 使用视图:像表一样使用
select * from v_student_info;

在这里插入图片描述

2、有些复杂的SQL又是经常用到的,如多张表的连表操作:可以利用视图实现

# 院系表
create table school(
	id int primary key auto_increment,
    name varchar(50) not null
);
insert into school values(null,'语言系'),(null,'考古系');

# 专业表
create table major(
    id int primary key auto_increment,
    name varchar(50) not null,
    s_id int not null comment '学院id'
);
insert into major values(null,'English',1),(null,'Chinese',1);

# 学生表
create table student(
	id int primary key auto_increment,
    name varchar(50) not null,
    m_id int not null comment '专业Id'
);
insert into student values(null,'Lilei',2),(null,'Mark',2),(null,'Tony',1);

# 获取所有学生的明细信息
select stu.*,maj.name as maj_name,maj.s_id as sch_id,sch.name as sch_name from student stu left join major maj on stu.m_id = maj.id left join school sch on maj.s_id = sch.id;

# 以视图保存这类复杂指令,后续可以直接访问视图
create view v_student_detail as select stu.*,maj.name as maj_name,maj.s_id as sch_id,sch.name as sch_name from student stu left join major maj on stu.m_id = maj.id left join school sch on maj.s_id = sch.id;

select * from v_student_detail;

在这里插入图片描述

小结

1、视图是用来提供数据支持的,是由select指令组成的结构

扫描二维码关注公众号,回复: 8964320 查看本文章
  • 存在结构
  • 不存在数据(数据是使用时调用select指令动态获取数据)

2、视图的目的

  • 方便提供全面数据:可以根据需求组织数据,而实际上不会在数据库产生数据冗余
  • 数据安全:视图本质是来源于数据基表,但是对外可以保护基本的数据结构

·视图管理

对视图结构的管理

  • 视图查看:显示视图结构和具体视图信息
show tables;	# 查看全部视图
show create table/view 视图名字;	# 查看视图创建指令
desc 视图名字;	 # 查看视图结构
  • 视图修改:更改视图逻辑
# 更改视图
alter view 视图名 as 新的查询指令;
create or replace view 视图名 as 新的查询指令;	# 创建新的或者替换新的(会先判断试图是否存在)
  • 视图删除
drop view 视图名; 

·视图数据操作

直接对视图进行写操作(增删改)然后实现基表数据的变化

  • 视图所有的数据操作都是最终对基表的数据操作
  • 视图操作条件
    • 多基表视图:不允许操作(增删改都不行)
    • 单基表视图:允许增删改
      • 新增条件:视图的字段必须包含基表中所有不允许为空的字段
    • with check option:操作检查规则
      • 默认不需要这个规则(创建视图时指定):视图操作只要满足前面上述条件即可
      • 增加此规则:视图的数据操作后,必须要保证该视图还能把通过视图操作的数据查出来(比如删除)

示例

1、增加一个单表视图和多表视图

create view v_student_1 as select stu_id,stu_name from my_student;  --单表视图
create view v_student_2 as select * from my_student s left join my_class c on s.class_id = c.id;  --多表视图
create or replace view v_student_3 as select * from my_student where class_id = 1 with check option;  --带有check option的单表视图

2、新增数据

insert into v_student_1 values('23','student7');	# 正确:视图包含所有不为空字段
insert into v_student_2 values(); # 错误:多基表不可插入
insert into v_student_3 values('stu009','jerry',2,1,10,10); # 错误:check option failed,class_id需要等于1,否则不符合视图筛选条件,查不出来
insert into v_student_3 values('stu009','jerry',1,1,10,10);	# 正确

3、更新数据

规则与增加数据类似

4、删除数据

delete from v_student_1 where stu_name = 'jerry'; # 正常删除
delete from v_student_2;	# 错误:多基表不可删除
delete from v_student_3 where stu_name = 'jerry';	# 可以删除,说明with check option不影响删除操作

小结

1、视图数据操作一般情况下是不允许的,通常之所以对外提供视图就提供数据的只读操作

2、视图数据操作与视图的基表数量和字段有关

  • 多基表视图不允许任何写操作
  • 单基表视图允许更新和删除、根据情况允许新增(视图包含基表中所有不允许为空字段)

3、with check option是针对有where条件的视图组成有效,需要手动选择是否增加该选项

  • 视图数据的新增、修改后,必须与原来的查询结果是一致的(新增一定要能在视图中看到)
  • 视图数据的删除不受with check option影响
  • 视图数据的新增、修改都是针对当前视图能查出来的,否则既不报错也不生效

·视图算法

指视图在执行过程中对于内部的select指令的处理方式

  • 视图算法在创建视图时指定
create ALGORITHM = 算法 view 视图名字 as select指令;
  • 视图算法一共有三种
    • undefined:默认的,未定义算法,即系统自动选择算法
    • merge:合并算法,就是将视图外部查询语句跟视图内部select语句合并后执行,效率高(系统优先选择)
    • temptable:临时表算法,即系统将视图的select语句查出来先得出一张临时表,然后外部再通过select查询(temptable算法视图不允许写操作)

示例

1、创建三种不同算法视图

create algorithm = undefined view v_student_4 as select * from my_student order by stu_age desc;
create algorithm = merge view v_student_5 as select * from my_student order by stu_age desc;
create algorithm = temptable view v_student_6 as select * from my_student order by stu_age desc;
-- 结果一样

2、使用视图:为了体现算法效果,给视图增加分组效果

select count(*),any_value(stu_name),any_value(stu_age),max(stu_age),class_id from v_student_4 group by class_id;
select count(*),any_value(stu_name),any_value(stu_age),max(stu_age),class_id from v_student_5 group by class_id;
select count(*),any_value(stu_name),any_value(stu_age),max(stu_age),class_id from v_student_6 group by class_id;

前两种结果一样
在这里插入图片描述
temptable
在这里插入图片描述
3、临时表算法的视图不能进行数据插入操作

insert into v_student_6 values('stu009','jerry',1,1,10,10);# 错误:不可插入


一般在设计视图的时候要考虑到视图算法的可行性,通常视图中如果出现了order by排序的话,就要考虑使用temptable算法

  • 只要merge以后,不会导致数据因为子句的先后顺序而混乱(order by与group by的顺序混乱容易出问题)
发布了19 篇原创文章 · 获赞 20 · 访问量 9527

猜你喜欢

转载自blog.csdn.net/qq_39323164/article/details/104158342
今日推荐