一、视图
视图:
1、也称虚表,不占用物理空间。视图中的数据是从实际表中获得的。每次使用视图的时候,只是重新执行sql语句。
2、用于产生视图的表叫做该视图的基表,一个视图可以从另一个视图中产生。
3、在oracle中如果是只读视图的话,仅仅能查询基表中的数据;在其他视图中如果修改视图中的数据,基表的数据也会发生改变
4、在oracle数据库中存在物化视图,物化视图有两种:ON DEMAND(仅在该视图需要被刷新时在进行刷新操作,经常使用)、ON COMMIT(一旦基表有了数据提交就会刷新视图,太频繁)
视图的创建:
create [or replace] VIEW view AS 子查询 [WITH READ ONLY];
例如:create view v_emp as select * from emp where deptno = 10;
授权视图:
如果普通用户第一次创建视图,提示没有权限,要使用管理员去修改权限
1、sqlplus /nolog
2、conn sys/bjmsb@orcl as sysdba;
3、grant create view to scott;
视图的使用:
select * from v_emp;
向视图中添加数据:(执行成功之后需要提交事务,绿色表示提交事务,红色表示回滚事务)
insert into v_emp(empno,ename) values(1111,'zhangsan');
细节注意:当你执行插入sql,但未提交事务时,此时该数据已经插入到基表中(该数据为脏数据),使用当前会话能查到,但是使用其他会话查不到。
执行结束sql语句只是将该条数据写入缓存空间中,但并未写入该表的数据文件中。提交事务只是将该条数据刷写到与该表对应的数据文件中。
如果定义的视图是非只读视图的话,可以通过视图向表中插入数据,如果是只读视图的,则不可以插入数据,只读视图只提供查询的需求,无法进行增删改操作
create view v_emp2 as select * from emp with read only;
删除视图,不会对基表中数据产生影响
drop view v_emp2;
当删除视图中的数据的时候,如果数据来源于多个基表,则此时不能全部进行删除,只能删除一个表中的数据
二、序列
1、在oracle中如果需要完成一个列的自增操作,必须要使用序列
create sequence seq_name
increment by n 每次增长几
start with n 从哪个值开始递增
maxvalue ninomaxvalue 10^27 or -1 最大值
minvalue nino minvalue 最小值
cycle|nocycle 是否有循环
cache ninocache 是否有缓存
2、查看当前序列的值:select my_sequence.currval from dual;
获取序列的下一个值:select my_sequence.nextval from dual;
注意:如果创建好序列之后,没有经过任何的使用,那么不能获取当前的值,必须要先执行nextval之后才能获取当前值
使用序列:insert into emp(empno,ename) values(my_sequence.nextval,'hehe');
三、数据库操作语言
1、插入操作
insert into tableName(xxx,yyy) values('aaa','bbb')
2、创建表的操作
create table emp2 as select * from emp; 复制表同时复制表数据,不会复制约束
create table emp3 as select * from emp where 1=2; 复制表结构,不复制数据,不复制约束
3、删除操作
delete from tableName where condition; 条件删除
delete from tableName; 删除整张表
truncate table tableName; 删除整张表数据
注意:truncate不经过事务,不能恢复,效率高,容易误操作。delete可以进行回滚操作
4、修改操作
update tableName set col = val1,col = val2 where condition;
总结:增删改是数据库的常用操作,在进行操作的时候都要‘事务’的保证,事务变得非常关键
最主要的目的是为了数据一致性
如果同一份数据,在同一时刻只能一个人访问,就不会出现数据错乱的问题,但是在现在的项目中更多的是并发访问
并发访问的同时带来的就是数据的不安全,也就是不一致
如果要保证数据的安全,最主要的方式就是加锁的方式