Oracle 特有的 SQL 语法与事务管理
1. Oracle 特有的 SQL 语法
分页查询:ROWNUM、ROWID、FETCH FIRST
在查询结果中进行分页是常见的需求,Oracle 提供了几种方法来实现分页查询:
- ROWNUM:
ROWNUM
为查询结果的行号,返回结果中的每一行都有一个唯一的编号,通常用于分页查询。 示例:
SELECT * FROM (SELECT first_name, last_name FROM employees ORDER BY salary DESC)
WHERE ROWNUM <= 10;
- 上述查询返回按
salary
排序后的前 10 条记录。 - ROWID:
ROWID
是数据库中的物理地址标识符,可以通过它来获取表中某一行的物理位置。 示例:
SELECT ROWID, first_name, last_name FROM employees WHERE department_id = 10;
- FETCH FIRST(Oracle 12c 以后引入的分页语法):
FETCH FIRST
可以用来限制查询返回的记录数量,支持 OFFSET 和 FETCH 子句。 示例:
SELECT first_name, last_name FROM employees
ORDER BY salary DESC
FETCH FIRST 10 ROWS ONLY;
- 该查询返回工资最高的 10 位员工。
分组与分区查询:GROUP BY、HAVING、RANK、DENSE_RANK
- GROUP BY:
GROUP BY
用于将结果集中的数据按某一列进行分组,并且可以进行聚合操作。 示例:
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
- 按
department_id
分组,返回每个部门的平均工资。 - HAVING:
HAVING
用于在分组后过滤结果集。 示例:
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;
- 仅返回平均工资大于 5000 的部门。
- RANK 和 DENSE_RANK:
RANK
和DENSE_RANK
用于为查询结果集中的每一行数据分配一个排名。RANK
会为相同的值分配相同的排名,但会跳过下一个排名,而DENSE_RANK
则不会跳过排名。 示例:
SELECT first_name, salary, RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
SELECT first_name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_dense_rank
FROM employees;
2. 事务管理
事务的概念与特性(ACID)
事务是数据库中的一个执行单元,是一系列操作的集合,要么完全执行,要么完全不执行。ACID 是事务管理的四个基本特性:
- Atomicity(原子性):事务内的所有操作要么全部成功,要么全部失败。
- Consistency(一致性):事务执行前后,数据库的状态必须保持一致。
- Isolation(隔离性):事务的执行不受其他事务的影响。
- Durability(持久性):一旦事务提交,结果会永久保存在数据库中。
COMMIT、ROLLBACK、SAVEPOINT 的使用
- COMMIT:提交事务,将所有更改永久保存。
COMMIT;
- ROLLBACK:回滚事务,撤销事务中的所有更改。
ROLLBACK;
- SAVEPOINT:设置保存点,允许在事务中进行部分回滚。
SAVEPOINT savepoint1;
- 可以在之后执行回滚到某个保存点。
ROLLBACK TO savepoint1;
锁机制与并发控制
Oracle 使用锁机制来控制多个事务并发操作时对数据的访问,避免数据的不一致性。锁有多种类型:
- 共享锁(Shared Lock):允许多个事务读取数据,但不能修改数据。
- 排他锁(Exclusive Lock):当事务修改数据时,其他事务不能对该数据进行任何操作。
Oracle 提供了如下机制来保证数据一致性:
- 自动提交:Oracle 默认每个 SQL 语句都会自动提交。
- 显式事务:通过
BEGIN
、COMMIT
和ROLLBACK
来控制事务的边界。
3. Oracle 数据字典与视图
Oracle 数据字典是包含数据库结构、定义、用户和权限等元数据的系统表。通过查询这些数据字典视图,可以获取关于数据库对象的信息。
DBA、ALL、USER 视图
- DBA 视图:包含数据库的所有对象信息,通常只有 DBA 用户才有权限访问。
- 例如:
DBA_TABLES
、DBA_USERS
。 - ALL 视图:包含当前用户有权限访问的所有数据库对象的信息。
- 例如:
ALL_TABLES
、ALL_VIEWS
。 - USER 视图:仅包含当前用户自己拥有的数据库对象的信息。
- 例如:
USER_TABLES
、USER_OBJECTS
。
示例:
SELECT * FROM DBA_USERS;
SELECT * FROM ALL_TABLES WHERE owner = 'HR';
SELECT * FROM USER_TAB_COLUMNS WHERE table_name = 'EMPLOYEES';
数据字典表的作用
数据字典表存储了关于数据库对象(如表、视图、索引等)的元数据。它们是数据库的“蓝图”,在数据库的操作和管理中起着重要作用。你可以使用它们来查询数据库对象、权限、用户信息等。
示例:
SELECT table_name, column_name, data_type
FROM all_tab_columns
WHERE owner = 'HR' AND table_name = 'EMPLOYEES';
查询数据库对象元数据
使用数据字典视图查询有关数据库对象的元数据,有助于数据库管理和开发。
示例:
SELECT object_name, object_type
FROM all_objects
WHERE owner = 'HR';
通过掌握这些 Oracle 特有的 SQL 语法和事务管理,你能够更高效地进行数据库查询与数据操作。同时,事务管理和锁机制为多用户并发访问数据库提供了强有力的支持。