1.什么是视图
数据库视图是虚拟表或逻辑表,它被定义为具有连接的SQL SELECT查询语句。
视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);
2.视图的作用
提高了重用性,就像一个函数。 方便操作,对于很复杂的sql查询,使用视图,可以变得简洁方便,提高性能;
提高了安全性能。比如,对不同的用户,设定不同的视图,权限控制的时候,不希望用户访问表中某些含敏感信息的列;
可以跟基本表一样,进行增删改查操作。(ps:一个简单的视图可以更新表中数据。基于具有连接,子查询等的复杂SELECT语句创建的视图无法更新。);
3.一个简单的视图实例:创建视图
现有三个表,users用户表,company公司表,user_company用户公司关联表
联合查询,查询所有用户及其所属的公司信息
select u.id,u.name,c.company_name,c.description from users u left join user_company uc on u.id=uc.uid left join company c on uc.cid=c.id;
select u.id,u.name,c.company_name,c.description from users u left join user_company uc on u.id=uc.uid left join company c on uc.cid=c.id;
创建视图view_user_company,查询所有用户及其所属的公司信息,sql代码如下
DROP VIEW
IF EXISTS `view_user_company`;
CREATE VIEW view_user_company AS(
select u.id,u.name,c.company_name,c.description
from users u
left join user_company uc on u.id=uc.uid
left join company c on uc.cid=c.id
);
DROP VIEW
IF EXISTS `view_user_company`;
CREATE VIEW view_user_company AS(
select u.id,u.name,c.company_name,c.description
from users u
left join user_company uc on u.id=uc.uid
left join company c on uc.cid=c.id
);
此时,视图已经建立成功。
4.简单视图实例二:视图的增删改查
一个简单的视图可以更新表中数据。基于具有连接,子查询等的复杂SELECT语句创建的视图无法更新。
1.查询视图view_user_company,此时查询所有用户及其所属的公司就很简洁了
select * from view_user_company;
select * from view_user_company;
2.修改视图数据,将用户编号为1的用户修改姓名、所属的公司,跨表连接修改则会失败,如下
update view_user_company set name='allen',company_name='google' where id=1;
update view_user_company set name='allen',company_name='google' where id=1;
因为不能在一张由多张关联表连接而成的视图上做同时修改两张表数据的操作;
2.1如果只修改一张表的数据,且没有其它约束,是允许的,而且同时会更新基表,如下,更新用户编号为1的用户的姓名
update view_user_company set name='allen' where id=1;
update view_user_company set name='allen' where id=1;
此时用户表同时更新编号为1的用户的姓名数据
同时,在一张由多张关联表连接而成的视图上做新增、删除两张表数据的操作,以下操作失败
insert into view_user_company(name,company_name,description) values ('hellon','tencent','tencent是一家发展很棒的公司');
delete from view_user_company where id=1;
哪些操作可以在视图上进行呢?
如果视图只有一张表的数据,且与其他表没有约束关系,则可以增删改查,我们新建一个用户表视图;
DROP VIEW
IF EXISTS `view_userinfo `
create view view_userinfo as (
select * from users
);
DROP VIEW
IF EXISTS `view_userinfo `
create view view_userinfo as (
select * from users
);
进行增删改操作如下,此时操作成功
select * from view_userinfo; insert into view_userinfo(name,password,address) values ('kally','123123','南京'); update view_userinfo set name='linxi' where id=5; delete view_userinfo where id=5; |
删除整个视图:drop命令,此时基表并不会有任何影响;
drop view 'view_user_company'
注意:删除、修改操作时要小心,不小心就会修改了基表中的很多条数据