视图
什么是视图?
数据库中表和视图都是其内部的对象,视图可以理解成一个虚拟的表,视图本质就是取代了一段sql查询语句.
为什么使用视图?
因为有些数据的查询需要使用大量的sql语句,每次书写比较麻烦,使用视图可以起到sql重用的作用,可以隐藏表中的敏感信息.
格式:
create view 视图名 as 子查询;
例如: 创建部门是20并且工资小于3000的视图
create view v_emp_20 as (
select * from emp where deptno=20 and sal<3000
);
视图的分类
- 简单视图: 创建视图的子查询中不包含: 去重,函数,分组,关联查询的视图称为简单视图.可以对数据进行增删改查操作.
- 复杂视图: 创建视图的子查询中包含: 去重,函数,分组,关联查询的视图称为复杂视图.只能进行查的操作
视图增删改
简单视图的增删改操作 操作方式和table一样
插入数据
如果插入的数据在视图中不显示但是原表中显示,称为数据污染
错误写法 因为视图中时按照depon=10 查找的
insert into v_emp_10 (empno,ename) values
(10010,'Tom');
正确写法
insert into v_emp_10 (empno,ename,deptno) values
(10086,'Jerry',10);
可以通过with check option
关键字禁止出现数据污染
create view v_emp_30 as (select * from emp where deptno=30)
with check option;
测试:
insert into v_emp_30 (empno,ename,deptno) values
(10011,'张三',30);
insert into v_emp_30 (empno,ename,deptno) values
(10012,'李四',20);
修改数据
只能修改视图中存在的数据,原表中存在,但视图中不存在也不会改
update v_emp_30 set ename='张三' where empno=10011;
update v_emp_30 set ename='汤姆' where empno=10010;
删除数据
delete from v_emp_30 where empno=10011;
delete from v_emp_30 where empno=10010;
修改视图
(如果有就修改,如果没有就创建)
格式: create or replace view 视图名 as 子查询;
例如:
create or replace view v_emp_10 as (
select * from emp
);
删除视图
drop view v_emp_10;
drop view if extract v_emp_10; -- 有就删,没有也不会报错
视图别名
创建视图的时候子查询对字段起了别名, 则后期对视图进行操作只能使用别名.
测试:
create view v_emp_10 as (select empno,ename name from emp);
update v_emp_10 set name='汤姆' where empno=10010; -- (成功)
update v_emp_10 set ename='汤姆aaa' where empno=10010; -- (失败:只能使用别名进行操作)