[Oracle数据库] Oracle 进阶应用
对于刚接触 Oracle 数据库的初学者来说,掌握基础的增删改查后,进阶应用的学习能让你更高效地管理和操作数据。本文将围绕 Oracle 的四大核心进阶功能 —— 事务、序列、视图和索引,用通俗易懂的语言拆解重点,帮你快速入门。
一、Oracle 事务:数据操作的 "安全保障"
事务是数据库区别于文件系统的核心特性,它能保证一组数据操作的完整性。简单来说,事务就是把数据库从一种状态安全地转换到另一种状态的操作集合。
1️⃣事务的四大特性(ACID)
事务的核心在于四大特性,缺一不可,初学者必须牢记:
- 原子性(Atomicity):事务中的操作要么全成功,要么全失败。比如转账时,"扣钱" 和 "加钱" 必须同时完成,若中间出错,整个操作会回滚到初始状态。细分为语句级、过程级和事务级原子性。
- 一致性(Consistency):事务执行前后,数据库的状态始终符合业务规则。例如银行账户余额不能为负数,事务结束后这个规则一定成立。
- 隔离性(Isolation):多个事务同时执行时,彼此互不干扰。就像两个用户同时操作同一张表,各自的修改不会互相影响,直到事务提交。
- 持久性(Durability):事务一旦提交,修改就永久保存到数据库中,即使断电或崩溃,数据也不会丢失。
2️⃣事务的常用语句
Oracle 中通过以下语句控制事务:
- 提交(COMMIT):确认事务的所有修改,结束事务并释放锁。提交后,其他用户可以看到最新数据。例如:
COMMIT;
(等同于COMMIT WORK;
) - 回滚(ROLLBACK):取消事务的所有修改,回到事务开始前的状态。例如:
ROLLBACK;
(等同于ROLLBACK WORK;
) - 保存点(SAVEPOINT):在事务中设置标记点,用于部分回滚。例如:
- 设置保存点:
SAVEPOINT a;
- 回滚到指定点:
ROLLBACK TO a;
(仅取消保存点之后的操作,之前的保留)
- 设置保存点:
3️⃣事务的注意事项
- Oracle 中事务是隐式开始的:不需要手动执行 "开始事务" 的命令,当执行第一条修改数据库的语句(如 INSERT、UPDATE)时,事务自动启动。
- 事务必须显式结束:需手动用
COMMIT
或ROLLBACK
结束,否则事务会一直占用资源,甚至锁定表。
二、序列:主键自动管理的 "小助手"
Oracle 中主键不支持自动增长,而序列(Sequence)就是解决这个问题的工具。序列是一组连续且唯一的数字集合,常用于生成主键值。
1️⃣序列的核心特点
- 每个数字只能使用一次,避免重复。
- 使用前必须初始化(通过创建语句定义规则)。
2️⃣创建序列
创建序列时需要指定数字的范围、起始值和步长等规则,语法如下:
sql
CREATE SEQUENCE 序列名MINVALUE 最小值 -- 例如1MAXVALUE 最大值 -- 例如100000000START WITH 起始值 -- 从哪个数字开始INCREMENT BY 步长 -- 每次增长多少(通常为1)CACHE 缓存数量; -- 预存多少个数字提高效率(如20)
示例:创建一个从 1 开始、步长 1、最大 1 亿的序列student1_seq
:
sql
CREATE SEQUENCE student1_seqMINVALUE 1MAXVALUE 100000000START WITH 1INCREMENT BY 1CACHE 20;
3️⃣序列的常用方法
- NEXTVAL:获取序列的下一个值,同时初始化序列(第一次使用时必须用它)。每次调用,序列自动增长 1。
示例:插入数据时用序列生成主键sql
INSERT INTO student1 VALUES(student1_seq.NEXTVAL, '张三'); INSERT INTO student1 VALUES(student1_seq.NEXTVAL, '李四');
- CURRVAL:获取序列当前的值(必须先调用过 NEXTVAL 才能使用)。
示例:查询当前序列值sql
SELECT student1_seq.CURRVAL FROM dual;
三、视图:数据查询的 "简化镜"
视图是基于表或其他视图的逻辑表,本身不存储数据,本质是一条预存的 SELECT 语句。它能简化查询、提高安全性,是初学者必须掌握的工具。
1️⃣视图的核心特点
- 可以像表一样使用(查询、部分修改)。
- 数据完全依赖于基表(视图基于的表),基表数据变,视图数据也变。
- 创建视图需要 DBA 权限(或管理员授予的权限)。
2️⃣视图的优点
- 提高安全性:可以只展示表中的部分数据(如隐藏敏感字段),限制用户访问范围。
- 简化查询:将复杂的多表查询封装成视图,用户只需简单查询视图即可。
- 数据独立性:即使基表结构变化,只要视图定义不变,用户查询不受影响。
- 灵活展示:同一组数据可以创建多个视图,满足不同场景的查询需求。
3️⃣视图的分类
视图分为简单视图和复杂视图,区别如下:
类型 | 数据来源 | 是否包含函数 / 分组 | 能否增删改(DML) |
---|---|---|---|
简单视图 | 单张表 | 不包含 | 可以 |
复杂视图 | 多张表 | 包含(如 MAX、AVG) | 不可以 |
4️⃣视图的创建、修改与删除
创建语法:
sql
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 视图名 [(别名...)] AS SELECT语句 [WITH CHECK OPTION] -- 插入/修改的数据必须满足视图条件 [WITH READ ONLY]; -- 视图只能查询,不能修改
说明:
OR REPLACE
表示若视图存在则替换;FORCE
表示即使基表不存在也创建。示例:
- 简单视图(单表查询,无函数):
sql
CREATE OR REPLACE VIEW my_view AS SELECT deptno "部门号", ename "员工名" FROM my_emp;
- 复杂视图(多表 / 含函数,这里以单表分组为例):
sql
CREATE OR REPLACE VIEW my_count AS SELECT deptno "部门号", MAX(sal) "最高工资", AVG(sal) "平均工资" FROM my_emp GROUP BY deptno;
- 简单视图(单表查询,无函数):
修改视图:通过
OR REPLACE
覆盖原视图,或删除后重建。删除视图:
DROP VIEW 视图名;
(删除视图不影响基表数据)。
四、索引:查询速度的 "加速器"
索引就像书籍的目录,能帮数据库快速定位数据,大幅提高查询效率。但索引不是越多越好,需合理使用。
1️⃣索引的核心作用
- 加快查询速度(尤其是大表)。
- 代价:增加存储空间,降低插入、删除、更新(DML)的速度(因为索引需要同步维护)。
2️⃣索引的使用原则(关键!)
初学者最容易滥用索引,记住以下原则:
- 适合建索引的场景:
- 大表中,WHERE 子句频繁引用的列(检索行数少于 15%)。
- 多表连接时的连接列(如 JOIN 条件中的列)。
- 频繁需要排序的列(如 ORDER BY 后的列)。
- 不适合建索引的场景:
- 小表(数据少,全表扫描比索引更快)。
- 频繁修改的表(索引会拖慢 DML 操作)。
- 列值重复率高的列(如 "性别" 列,区分度低)。
3️⃣索引的分类
按不同维度可分为:
- 按存储方式:B 树索引(最常用,兼顾查询和插入效率)、反向索引、位图索引。
- 按列数:单列索引(基于单个列)、复合索引(基于多个列,列顺序影响效率)。
- 按唯一性:唯一索引(列值不重复,如主键默认会建唯一索引)、非唯一索引。
4️⃣索引的创建示例
- 单列索引:
sql
CREATE INDEX empno_index ON newemp(empno); -- 为newemp表的empno列建索引
- 复合索引(多列组合,顺序重要):
sql
CREATE INDEX emp_idx ON newemp(empno, ename); -- 先按empno,再按ename
- B 树索引(预留空间,方便后续插入):
sql
CREATE INDEX ind_ename ON emp(ename) PCTFREE 30 -- 预留30%空间给后续插入 TABLESPACE my_file; -- 指定存储位置
总结
Oracle 的事务、序列、视图和索引是进阶操作的核心,它们分别解决了数据完整性、主键管理、查询简化和效率优化的问题。初学者建议先理解每个功能的 "为什么用",再掌握 "怎么用",最后通过实践(如创建事务测试回滚、用序列管理主键、设计视图简化报表、为大表加索引测试速度)加深理解。