Oracle索引、视图、序列、同义词、事务、锁机制详解

索引

什么是索引?

-- 索引就类似于书的目录,根据目录查询内容会快很多,提高数据查询效率

创建索引有俩种方式

1、Oracle会自动为主键和唯一键创建索引

2、手动创建约束。
那么表中什么样的字段应该添加索引?
在查询的时候,经常被用来做为查询的字段,应该添加索引

-- 创建索引
create index 索引名字 on 表名(字段);
create index ename_index on emp(ename);
select * from emp where ename='SMITH';
-- 索引是看不见摸不着的,现在我们的的表数据太少,看不出效果,其实我们已经给ename做了索引,这样查询远比我们之前没做索引的时候要快很多。


删除索引

-- 删除索引
drop index 索引名字;
drop index ename_index;
-- 自动创建的约束是无法删除的,但是在删除主键约束和唯一约束的时候才会被删除。

视图

什么是视图?

-- 我们之前做的子查询就是一个视图
-- 视图也就是虚表,实际上是一个命名的查询,用户改变数据的显示形式,简化查询,访问视图与表的访问方式一样。

视图有什么好处?

-- 1、可以限制对数据的访问,让用户通过视图可以看到表中的一部分数据
-- 2、可以使复杂的查询变得简单
-- 3、提供了数据的独立性,用户不知道数据来源处
-- 4、提供了对相同数据的不同显示

-- 视图,就是一个虚表,我们可以从这个表中查询数据
-- 视图,就是一个命名的查询语句
-- 任何有效的查询语句都可以作为视图

创建视图

create view 视图名字 as 查询语句;
create view HR_VIEW as select * from emp;
create view XM_VIEW as select empno,ename,mgr,hiredate,deptno from emp;

分配创建视图权限

-- 一般为了方便,我们都是直接赋值dba权限给用户
grant dba to scott;
-- 或者只赋值一个创建视图的权限
grant create view to scott;

查看视图表结构

-- 我们可以在命令行窗口模式下查看表的结构,也可以查看视图的结构
desc emp;
desc HR_VIEW;

替换视图

-- or replace:如果视图存在,则替换旧视图。
create or replace view HR_VIEW as select * from emp;

删除视图

drop view 视图名字;
-- 删除视图不会影响原来的数据。

注意事项

-- 我们平常在做表连接的时候,会出现相同的列,但是不影响我们查询。但是在创建视图的时候,不能出现相同列,这个时候我们就不能创建视图了。
-- 比如
create or replace view view_empinfo
as
select e.*,d.* from emp e,dept d where e.deptno = d.deptno;  -- 这条查询语句是没有问题的,但是在创建视图的时候,就会报错。
-- 这个时候,我们就需要用别名,将每个列都查询出来 或者相同的列只显示一个
create or replace view view_empinfo
as
select e.empno,e.ename,e.job,e.mgr,e.sal,d.dname,d.loc from emp e,dept d where e.deptno = d.deptno;

视图有多方便?

-- 假如我们在计算员工年收入的时候,我们每次都需要查询,非常麻烦,那么我们就可以把年收入计算出来做成视图,以后就只要在视图中查询就可以了
create or replace view view_name
as
select e.empno,e.ename,e.job,e.mgr,e.sal,d.dname,d.loc,sal+nvl(comm,0) 年薪 from emp e,dept d where e.deptno = d.deptno;
-- 那么我以后查询年薪的时候就可以从视图中查询了
select 年薪 from view_name;

视图可以操作数据吗,可以做DML操作吗?

-- 视图一般用于查询,不建议DML操作
-- 如果我需要创建一个视图,并且不能进行DML操作,那么我就要用到下面的写法
-- with read only 创建只读视图,不能执行DML操作
create or replace view view_name
as
select * from emp
with read only;

-- 同样的,如果我们需要对视图进行DML操作时,那么我们可以省略 with read only 或者 改为with check option
create or replace view view_name
as
select * from emp
[with check option;]

对视图进行DML的需要注意什么?

-- 1、如果违反基表的约束条件时,则不能更新。
-- 2、如果视图中包含链接操作符、distnct关键字、聚合函数、集合操作符或group by 子查询的时候,不能更新
-- 3、如果视图存在伪劣的时候,则不能更新

序列

什么是序列?

-- 序列是Oracle自动给我们生成的一个序列的对象

序列什么用?

-- 序列一般用于生成主键或者达到主键自增的效果

创建序列

-- 语法
create sequence 序列名字(
	start with 1 -- 表示从1开始
    increment by 1 -- 表示每次执行的时候,增加多少。一般用1
    minvalue 1 -- 序列最小值,一般用了 start with 不会用minvalue(可以省略)
    maxvalue 10 -- 序列最大值,表示序列到最大值是停止(可省略)
    cache|nocache -- 缓存,可省略,默认为 20 , 省略不写就是 nocache
    cycle|nocycle -- 是否生成循环,一边和maxvalue使用,表示到maxvalue后从start whit 使用,可省略,省略不写就代表 nocycle
)

序列的俩个属性

-- nextval:取序列的值,并且序列的值增加。
-- currval:取序列当前的值。不能直接去当前值,需要执行nextval后才可以

修改序列

alter sequence 序列名字 maxvalue 5000;
-- 注意,不能修改序列的 start whit 值,但是能修改maxvalue、cache、cycle、increment by。

删除序列

drop sequence 序列名字;

如何利用序列创建主键自增?

-- 创建一个序列
create sequence mysqe
start whit 1
increment by 1
insert into 表名 values(myseq.nextval,'值','值'...)

如何查看序列的值?

-- Oracle为我们提供了一个虚表 dual,序列的值就保存到dual中
select myseq.nextval from dual;
select myseq.currval from dual; 

注意:如果序列达不到顺序自增的话怎么办?

-- 关闭延迟技术
ALTER SYSTEM SET deferred_segment_creation=FALSE;

同义词

什么都是同义词?

-- 同义词,就是数据库对象的一个别名,可以简化访问其他用户的数据库对象。缩短了对象名称的长度,同时屏蔽了对象的名称,使用户不知道最终的数据来源与那个对象。

创建同义词的语法

create synonym 同义词名字 for 表(对象);
create synonym stu for student;
-- 那么以后查询的时候,我就可以这么使用
select * from stu;

赋值创建同义词的权限

grant create any synonym to 用户名;

删除同义词

drop synonym 同义词;

事务

什么是事务?

-- 一组相关的数据改变SQL语句,这组SQL语句对数据的改变要么同时成功,要么同时失败。
-- 自我理解:如果理解事务这个词呢?在数据库中,事务指的是可以实现数据库中的存储的数据的改变。也就是说insert、update、dalete语句。一组sql语句,可以实现数据的改变。

/*
事务必须具备以下四个属性,简称ACID 属性:
原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行
一致性(Consistency):当事务完成时,数据必须处于一致状态
隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

例如银行转账。
孙昊账户有1000元,大哥0元,所谓原子性就是孙昊给大哥转钱,孙昊转钱和大哥收钱,这两步必须是同时发生的,如果某一步出错或者不发生,业务就出现问题,那么这个事务肯定出错。所谓一致性就是,孙昊和大哥一共1000元,转完钱后还是1000元。 
*/

查看事务

show autocommit;

开启或关闭事务

set autocommit on|off;

显式事务

set autocommit off; -- 关闭事务的自动提交
-- 手动调用
commit; -- 提交
rollback; -- 回滚 类似于撤销

隐式事务

set autocommit on; -- 打开事务的自动提交
-- 打开后 create、drop、grant等操作事务是自动提交的
-- 每一个insert、update、delete执行后都会提交到数据库

事务保存点

-- 语法 
savepoint 名字;
-- 用法
insert into stu values(1,'aa');
savepoint s1;
insert into stu values(2,'aa');
savepoint s2;
insert into stu values(3,'aa');
savepoint s3;
insert into stu values(4,'aa');
savepoint s4;
-- 假如在第三条语句出错了,我单纯的用回滚的话,那么我之前的语句就需要再次添加了。那么我就可以这么回滚
rollback to s3;

锁的概念

/*
锁是用来对数据库的共享资源并发机制的控制。也就是说锁是用来保护正在修改的数据,
知道这些数据提价或者回滚事务之后,其他用户才可以进行修改。
如果没有锁,那特么就乱了套了。假如十八和艳子同时对一张表进行操作,
再都没进行事务提交或回滚的情况下,此时我数据库该听谁的命令?
总不能谁漂亮听谁的吧?听十八的艳子不服气,听艳子的十八又不服气。
总不能让俩人打一架吧,谁赢听谁的?所以只有艳子提交了事务之后,十八才能更新数据。
*/

锁的类型

-- 分为两种,行级锁和表级锁。

/* 行级锁:是一种排他锁,防止其他事务修改此行
	在使用 insert、update、delete、select .... for update[WAIT n (等几秒)| NOWAIT(不等待)|skip locked(跳过)]语句的时候,Oracle会自动启动行级锁。
	当使用commit或者rollback的时候才会释放锁
	假如一个用户占据锁的时候过长怎么办? 利用管理杀掉该session
	select * from v$lock; 查看锁  拿到sid
	select sid,serial# from v$session where sid='141'; 查看sid和 serial
	然后执行
	alter system kill session 'sid,serial';
*/
/*
表级锁:锁定整个表
lock table 表名 in mode(mode就是锁的模式) mode;
共享锁:只允许用户select,不能做insert、update、delete操作,多个用户可以同时对同一张表进行表级锁
行共享(row share) -- 禁止排他锁定表
行排他(row exclusive) -- 禁止使用排他锁和共享锁
共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁
排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表
*/

猜你喜欢

转载自blog.csdn.net/Hao1999_/article/details/119552252