-- 索引就类似于书的目录,根据目录查询内容会快很多,提高数据查询效率
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操作,那么我就要用到下面的写法
-- 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;]
-- 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) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表
*/