Oracle 特有的 SQL 语法与事务管理
                           
天天向上
发布: 2025-02-12 22:18:39

原创
315 人浏览过

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 的部门。
  • RANKDENSE_RANK
    RANKDENSE_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 语句都会自动提交。
  • 显式事务:通过 BEGINCOMMITROLLBACK 来控制事务的边界。

3. Oracle 数据字典与视图

Oracle 数据字典是包含数据库结构、定义、用户和权限等元数据的系统表。通过查询这些数据字典视图,可以获取关于数据库对象的信息。

DBA、ALL、USER 视图
  • DBA 视图:包含数据库的所有对象信息,通常只有 DBA 用户才有权限访问。
  • 例如:DBA_TABLESDBA_USERS
  • ALL 视图:包含当前用户有权限访问的所有数据库对象的信息。
  • 例如:ALL_TABLESALL_VIEWS
  • USER 视图:仅包含当前用户自己拥有的数据库对象的信息。
  • 例如:USER_TABLESUSER_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 语法和事务管理,你能够更高效地进行数据库查询与数据操作。同时,事务管理和锁机制为多用户并发访问数据库提供了强有力的支持。

发表回复 0

Your email address will not be published. Required fields are marked *