您当前的位置: 首页 >  sql

星夜孤帆

暂无认证

  • 3浏览

    0关注

    626博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MySQL学习笔记(18)-视图

星夜孤帆 发布时间:2018-06-10 00:06:59 ,浏览量:3

视图

视图:view,是一种有结构(有行有列)但是没结果(结构中不真实存放数据)的虚拟表,虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源)。

创建视图

基本语法

create view 视图名字 as select 语句;-- select 语句可以是普通查询;可以是连接查询;可以是联合查询;可以是子查询。

创建单表视图:基表只有一个

创建多表视图:基表来源至少两个

-- 视图:单表+多表
create view my_v1 as 
select * from my_student;
create view my_v2 as
select * from my_class;
create view my_v3 as
select * from my_student as s left join my_class c on s.c_id = c.id;
-- 多表视图
create view my_v3 as 
select s.*,c.c_name,c.room from my_student as s
left join my_class c    -- as省略
on s.c_id = c.id;

查看视图

查看视图:查看视图的结构

视图是一张虚拟表:表的所有查看方式都适用于视图:show tables [like]/desc 视图名字/show create table 视图名;

desc my_v1;
show create table my_v1;

视图比表还是有一个关键字的区别:view.查看表(视图)的创建语句的时候可以使用view关键字

-- 查看视图创建语句
show create view my_v3\G

视图一旦创建:系统会在视图对应的数据库文件夹下创建一个对应的结构文件:frm文件。

使用视图

使用视图主要是为了查询:将视图当作表一样查询即可。

-- 视图使用
select * from my_v1;
select * from my_v2;
select * from my_v3;

视图的执行:其实本质就是执行封装的select语句。

修改视图

视图本身不可修改,但是视图的来源是可以修改的。

修改视图:修改视图本身的来源语句(select语句)

Alter view 视图名字 as 新的 select 语句;

desc my_v1;
-- 修改视图
alter view my_v1 as
select id,name,age,sex,height,c_id from my_student;
desc my_v1;

show tables;
create view my_v4 as 
select * from my_student;
-- 删除视图
drop view my_v4;

视图意义

1.视图可以节省  SQL语句:将一条复杂的查询语句使用视图进行保存:以后可以直接对视图进行操作。

2.数据安全:视图操作是主要针对查询的,如果对视图结构进行处理(删除),不会影响基表数据(相对安全).

3.视图往往是在大项目中使用,而且是多系统使用:可以对外提供有用的数据,但是隐藏关键(无用)的数据:数据安全

4.视图可以对外提供友好型:不同的视图提供不同的数据,对外好像专门设计

5.视图可以更好(容易)的进行权限控制。

视图数据操作

视图是的确可以进行数据写操作的:但是有很多限制

将数据直接在视图上进行操作。

新增数据

数据新增就是直接对视图进行数据新增

1.多表视图不能新增数据

desc my_v3;
-- 多表视图插入数据
insert into my_v3 values(null, 'itcast0008','张三丰','男',150,180,'Java0326‘,’D306');

2.可以向单表视图插入数据:但是视图中包含的字段必须有基表中所有不能为空(或者没有默认值)的字段

desc my_v1;
-- 单表视图插入数据:视图不包含所有不允许为空字段(学号)
insert into my_v1 values(null,'张无忌',68,'男',174,2);

3.视图是可以向基表插入数据的。

select * from my_v2;
select * from my_class;
-- 单表视图插入数据
insert into my_v2 values(4,'Java0326','D306');
select * from my_class;

删除数据

多表视图不能删除数据

select * from my_v3;
-- 多表视图删除数据
delete from my_v3 where id=1;

单表视图可以删除数据

select * from my_v2;
select * from my_class;
-- 单表视图删除数据
delete from my_v2 where id = 4;
select * from my_class;

更新数据

理论上不管单表视图还是多表视图都可以更新数据

select * from my_v1;
-- 多表视图更新数据
update my_v1 set c_id = 1 where id = 5;
select * from my_v3;

更新限制:with check option ,如果对视图在新增的时候,限定了某个字段有限制:那么在对视图进行数据更新操作时,系统会进行验证:要保证更新之后,数据依然可以被实体查询出来,否则不让更新。

-- 视图:age字段限制更新
create view my_v4 as 
select * from my_student where age >35 with check option;
-- 表示视图的数据来源都是年龄大于30岁:where age>30决定
-- with check option:决定通过视图更新的时候,不能将已经得到的数据age>30的改成小于30的
select * from my_v4;
-- 将视图可以查到的数据改成小于35
update my_v4 set age = 29 where id=8;
-- 可以修改数据让视图可以查到
update my_v4 set age = 32 where id = 6;
select * from my_v4;

视图算法

视图算法:系统对视图以及外部查询视图的select语句的一种解析方式。

视图算法分为三种

    Undefined:未定义(默认的),这不是一种实际使用算法,是一种推卸责任的算法:告诉系统,视图没有定义算法,系统自己看着办。

    Temptable:临时表算法:系统应该先执行视图的select语句,后执行外部查询语句

    Merge:合并算法:系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高:常态)

算法指定:在创建视图的时候

create algorithm = 指定算法 view 视图名字 as select 语句;

-- 指定算法为临时表
create algorithm=temptable view my_v6 as
select * from my_student order by height desc;
show create view my_v6\G

视图算法选择:如果视图的select语句中会包含一个查询子句(五子句),而且很有可能顺序比外部的查询语句要靠后,一定要使用算法temptable,其他情况可以不用指定(默认即可)。

关注
打赏
1636984416
查看更多评论
立即登录/注册

微信扫码登录

0.0373s