视图
视图同基表一样,都是数据库对象
概述视图
MySQL视图是一种虚拟存在的表,视图也是由行和列构成,但是视图并不会实际存在于数据库中,行和列的数据来自于定义视图的查询中所使用的表,并在使用视图时动态生成。
视图和数据表的区别
- 视图不是真实的表,是一个虚拟表,其结构和数据都建立对基表真实查询的基础上
- 存储在数据库中的查询操作定义了视图的内容和结构,视图的行和列的数据来自于查询所引用的实际表,引用视图是动态生成
- 视图没有实际的物理记录,数据集实际存储在基表中
- 视图是数据的窗口,基表才是真实内容。视图是查看数据表的一种方式。从安全角度上来看,视图的数据安全性高,使用视图的开发人员不涉及数据表,深知可以不知道基表的真实结构
视图和基表
基表适用于存储真实数据
create table tb_dept(
id bigint primary key auto_increment,
name varchar(32)
);
insert into tb_dept(name) values('科研部'),('销售部'),('市场部');
create table tb_emp(
id bigint primary key auto_increment,
name varchar(32) not null,
dept_id bigint not null,
foreign key(dept_id) references tb_dept(id) on delete cascade
);
insert into tb_emp(name,dept_id) values('张三',1),('王五',2),('李四',3);
建立视图
基础语法:create view 视图名称 as 查询结果
create view v_emp as select e.id empno,e.name as ename,d.name dname from tb_emp e inner join tb_dept d on e.dept_id=d.id;
视图是一个虚表,其中并不直接存储数据,但是可以当作表的方式进行使用,具体数据来源于定义视图的查询结果集
select * from v_emp;
查看视图的结构desc 视图名称;
mysql> desc v_emp;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| empno | bigint(20) | NO | | 0 | |
| ename | varchar(32) | NO | | NULL | |
| dname | varchar(32) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
查看视图的定义,可以查看创建视图对应的SQL语句
show create view v_emp;
插入数据到视图
create view v_emp1 as select * from tb_emp where id>1;
insert into v_emp values(4,'熊大',1);
create view v_emp2 as select e.*,d.id did,d.name dname from tb_emp e inner join tb_dept d on e.dept_id=d.id;
因为向视图中插入数据实际上就是向基表中插入数据,也就是执行insert into v_emp values(4,'熊大',1);
,就是向基本表tb_emp中插入数据,只有没有违法基本中的规则则插入成功。
select * fro tb_emp;
insert into v_emp values(4,'熊大',1);
视图的数据来自于两个表的查询结果
mysql> desc v_emp;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| empno | bigint(20) | NO | | 0 | |
| ename | varchar(32) | NO | | NULL | |
| dname | varchar(32) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
insert into v_emp values(5,'熊二','人才部');
ERROR 1394 (HY000): Can not insert into join view 'test.v_emp' without fields list
create view v_emp2 as select e.*,d.* from tb_emp e inner join tb_dept d on e.dept_id=d.id;
-- ERROR 1060 (42S21): Duplicate column name 'id'
create view v_emp2 as select e.*,d.id did, d.name dname from tb_emp e inner join tb_dept d on e.dept_id=d.id;
desc v_emp2;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | bigint(20) | NO | | 0 | |
| name | varchar(32) | NO | | NULL | |
| dept_id | bigint(20) | NO | | NULL | |
| did | bigint(20) | NO | | 0 | |
| dname | varchar(32) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
insert into v_emp2(id,name,dept_id,did,dname) values(6,'小哥',1,null,'研发部');
-- ERROR 1393 (HY000): Can not modify more than one base table through a join view 'test.v_emp2'
insert into v_emp2(id,name,dept_id) values(6,'小哥',1);
- 允许针对视图进行数据的修改操作,但是不允许同时修改多于一个基表
- 如果数据是通过计算得到的,也不能修改
- distinct、group by、having、union和union all
- 视图的修改实际上是针对基表数据的修改,不允许违反基本的约束规则
- 视图允许嵌套,就是
create view v_emo3 as select * from v_emp1;
修改视图
当基表的结构发生变化时,可以修改视图定义。但是如果在视图定义中使用的列没有修改,则无需修改视图定义
语法:alter view 视图名称 as 新的查询;
删除视图
删除视图实际上就是删除视图的定义,不会删除数据
语法:drop view 视图名称;
视图的特点
- 视图的特点如下:视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立新的关系。
- 视图是由基本表产生的表。视图的建立和删除不影响基本表。
- 对试图内容的更新(添加、删除和修改)直接影响基本表。
- 当视图来自多个基本表时,有时可以修改数据,有时不允许修改数据。
- 视图的操作包括创建视图,查看视图,删除视图和修改视图
视图的优点
- 可以从基本表中进行数据定制,简化数据操作,提高数据的安全性
- 共享所需数据、修改数据格式
- 重用SQL语句