Oracle 数据库使用教程
目录
-
(图片来源网络,侵删)- 1 什么是 Oracle 数据库?
- 2 安装与配置
- 3 连接到数据库
- 4 基本工具介绍
-
- 1 DDL (Data Definition Language) - 数据定义语言
- 2 DML (Data Manipulation Language) - 数据操纵语言
- 3 DQL (Data Query Language) - 数据查询语言
- 4 DCL (Data Control Language) - 数据控制语言
-
- 1 什么是 PL/SQL?
- 2 变量与常量
- 3 控制结构
- 4 异常处理
- 5 游标
- 6 存储过程与函数
-
- 1 索引
- 2 视图
- 3 序列
- 4 同义词
-
- 1 用户管理
- 2 权限与角色
-
- 1 导出/导入
- DBMS_DATAPUMP (数据泵)
- 2 RMAN (Recovery Manager)
-
- 1 执行计划
- 2 索引优化
- 3 统计信息
-
- 1 官方文档
- 2 推荐书籍
- 3 最佳实践
第一部分:入门准备
1 什么是 Oracle 数据库?
Oracle 数据库是由 Oracle 公司开发的一款关系型数据库管理系统,它以其强大的功能、高可靠性、安全性和可扩展性而闻名,广泛应用于金融、电信、政府、大型企业等对数据稳定性要求极高的领域。
2 安装与配置
对于初学者,最简单的方式是安装 Oracle Database Express Edition (XE),它是免费的,对硬件资源要求较低,非常适合学习和开发。
- 下载:访问 Oracle 官网,搜索 "Oracle Database XE" 并下载对应操作系统的版本。
- 安装:按照安装向导进行操作,安装过程中需要设置一个管理员密码(
SYS,SYSTEM等超级用户)。 - 配置:安装完成后,XE 会默认启动一个名为
XE的数据库服务,并监听1521端口。
3 连接到数据库
连接 Oracle 数据库需要知道以下信息:
- 主机名:
localhost(如果安装在本机) - 端口:
1521(默认) - 服务名:
XE(XE 版本的默认服务名) - 用户名/密码: 如
SYSTEM/你设置的密码
常用连接方式:
-
*SQLPlus (命令行工具)**
# 在 Windows 命令提示符或 Linux/macOS 终端中 sqlplus /nolog SQL> conn system/your_password@localhost:1521/XE
或者直接登录:
sqlplus system/your_password@localhost:1521/XE
-
SQL Developer (图形化工具)
- 下载并安装 SQL Developer (免费)。
- 打开软件,点击左上角 "+" 号新建连接。
- 填写连接信息:
- 连接名: 任意,如
My Local DB - 用户名:
SYSTEM - 密码: 你的密码
- 主机名:
localhost - 端口:
1521 - 服务名:
XE
- 连接名: 任意,如
- 点击 "测试",显示 "成功" 后即可连接。
4 基本工具介绍
- *SQLPlus**: Oracle 自带的命令行客户端,最基础、最直接的工具,适合脚本化操作。
- SQL Developer: Oracle 官方提供的免费图形化客户端,功能强大,集成了开发、调试、DBA 管理等多种功能,强烈推荐初学者使用。
- PL/SQL Developer: 第三方付费工具,在 Windows 平台上非常流行,深受开发者喜爱。
第二部分:SQL 语言基础
SQL (Structured Query Language) 是与数据库交互的标准语言,Oracle 的 SQL 实现基于 ANSI 标准,并进行了扩展。
1 DDL (Data Definition Language) - 数据定义语言
用于定义和管理数据库的结构、对象。
| 命令 | 描述 | 示例 |
|---|---|---|
CREATE |
创建数据库对象 | CREATE TABLE employees (id NUMBER, name VARCHAR2(100)); |
ALTER |
修改数据库对象 | ALTER TABLE employees ADD (salary NUMBER(10, 2)); |
DROP |
删除数据库对象 | DROP TABLE employees; |
TRUNCATE |
清空表数据(速度快,不可逆) | TRUNCATE TABLE employees; |
RENAME |
重命名对象 | RENAME employees TO emp; |
2 DML (Data Manipulation Language) - 数据操纵语言
用于操作表中的数据。
| 命令 | 描述 | 示例 |
|---|---|---|
INSERT |
插入数据 | INSERT INTO emp (id, name) VALUES (1, 'Alice'); |
UPDATE |
更新数据 | UPDATE emp SET name = 'Bob' WHERE id = 1; |
DELETE |
删除数据 | DELETE FROM emp WHERE id = 1; |
注意: DML 操作默认不会立即提交到数据库,需要执行
COMMIT;才会永久保存,执行ROLLBACK;可以撤销未提交的 DML 操作。
3 DQL (Data Query Language) - 数据查询语言
用于从数据库中检索数据。SELECT 是最核心的命令。
-- 基本查询 SELECT id, name FROM emp; -- 带条件查询 SELECT * FROM emp WHERE salary > 5000 AND department_id = 10; -- 排序 SELECT * FROM emp ORDER BY salary DESC; -- 聚合函数 SELECT COUNT(*) AS total_employees, AVG(salary) AS avg_salary FROM emp; -- 分组 SELECT department_id, COUNT(*) FROM emp GROUP BY department_id HAVING COUNT(*) > 5;
4 DCL (Data Control Language) - 数据控制语言
用于控制数据库的访问权限。
| 命令 | 描述 | 示例 |
|---|---|---|
GRANT |
授予权限 | GRANT SELECT, INSERT ON emp TO scott; |
REVOKE |
撤销权限 | REVOKE INSERT ON emp FROM scott; |
第三部分:PL/SQL 编程
PL/SQL 是 Oracle 对 SQL 的过程化扩展,它允许在数据库中编写复杂的逻辑、存储过程、函数等。
1 什么是 PL/SQL?
PL/SQL 将 SQL 语句与过程化语言结构(如变量、循环、条件判断)结合在一起,使得数据库不仅可以存储数据,还可以执行业务逻辑。
2 变量与常量
DECLARE
v_emp_name VARCHAR2(100);
v_salary NUMBER(10, 2) := 0;
c_bonus_rate CONSTANT NUMBER := 0.1; -- 常量
BEGIN
-- 查询并赋值
SELECT name INTO v_emp_name FROM emp WHERE id = 1;
v_salary := v_salary * (1 + c_bonus_rate);
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp_name); -- || 是连接符
DBMS_OUTPUT.PUT_LINE('New Salary: ' || v_salary);
END;
/
注意: 在 SQL Developer 中,要查看
DBMS_OUTPUT的输出,需要先启用它:点击菜单 "视图" -> "DBMS 输出",然后点击绿色 "+" 按钮,选择你的会话。
3 控制结构
-- IF 语句
DECLARE
v_score NUMBER := 85;
BEGIN
IF v_score >= 90 THEN
DBMS_OUTPUT.PUT_LINE('A');
ELSIF v_score >= 80 THEN
DBMS_OUTPUT.PUT_LINE('B');
ELSE
DBMS_OUTPUT.PUT_LINE('C');
END IF;
END;
/
-- LOOP 循环
DECLARE
i NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(i);
i := i + 1;
EXIT WHEN i > 5;
END LOOP;
END;
/
4 异常处理
使用 EXCEPTION 块来处理运行时错误。
DECLARE
v_emp_name emp.name%TYPE; -- %TYPE 表示与列名同类型
BEGIN
-- 尝试查询一个不存在的员工
SELECT name INTO v_emp_name FROM emp WHERE id = 999;
DBMS_OUTPUT.PUT_LINE('Found: ' || v_emp_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN -- 当 SELECT ... INTO 没有返回数据时触发
DBMS_OUTPUT.PUT_LINE('Error: Employee not found.');
WHEN OTHERS THEN -- 捕获其他所有异常
DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);
END;
/
5 游标
游标用于处理查询返回的多行结果集。
DECLARE
CURSOR c_emp IS SELECT id, name FROM emp; -- 定义游标
v_emp_id emp.id%TYPE;
v_emp_name emp.name%TYPE;
BEGIN
OPEN c_emp; -- 打开游标
LOOP
FETCH c_emp INTO v_emp_id, v_emp_name; -- 从游标中获取一行数据
EXIT WHEN c_emp%NOTFOUND; -- 当没有更多数据时退出循环
DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_emp_name);
END LOOP;
CLOSE c_emp; -- 关闭游标
END;
/
6 存储过程与函数
将 PL/SQL 代码块存储在数据库中,以便重复调用。
存储过程
CREATE OR REPLACE PROCEDURE raise_salary (
p_emp_id IN NUMBER,
p_amount IN NUMBER
) AS
BEGIN
UPDATE emp SET salary = salary + p_amount WHERE id = p_emp_id;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Salary raised for employee ' || p_emp_id);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee ' || p_emp_id || ' not found.');
END raise_salary;
/
调用存储过程:
EXECUTE raise_salary(1, 500);
函数 函数必须返回一个值。
CREATE OR REPLACE FUNCTION get_employee_name (
p_emp_id IN NUMBER
) RETURN VARCHAR2 AS
v_name emp.name%TYPE;
BEGIN
SELECT name INTO v_name FROM emp WHERE id = p_emp_id;
RETURN v_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'Unknown';
END get_employee_name;
/
调用函数:
SELECT get_employee_name(1) FROM DUAL;
第四部分:数据库对象管理
1 索引
索引是用于提高查询性能的数据结构,它类似于书的目录。
-- 创建索引 CREATE INDEX idx_emp_name ON emp(name); -- 删除索引 DROP INDEX idx_emp_name;
何时创建索引:经常用于
WHERE、JOIN、ORDER BY子句的列。 注意事项:索引虽然加快查询,但会降低INSERT,UPDATE,DELETE的速度,并占用存储空间。
2 视图
视图是一个虚拟表,其内容由查询定义,它简化了复杂查询,并可以隐藏底层表的结构。
-- 创建视图 CREATE VIEW v_employees AS SELECT id, name, department_id FROM emp WHERE salary > 4000; -- 使用视图 SELECT * FROM v_employees WHERE department_id = 20; -- 删除视图 DROP VIEW v_employees;
3 序列
序列用于生成唯一的数字序列,通常用作主键。
-- 创建序列 CREATE SEQUENCE seq_emp_id START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; -- 使用序列 INSERT INTO emp (id, name) VALUES (seq_emp_id.NEXTVAL, 'Charlie');
4 同义词
同义词是数据库对象(如表、视图、序列)的别名,可以简化访问,特别是跨用户访问时。
-- 创建同义词 CREATE SYNONYM emp FOR hr.employees; -- 假设 hr 用户下有 employees 表 -- 现在可以直接用 emp 访问 hr.employees SELECT * FROM emp WHERE ROWNUM <= 5;
第五部分:用户与权限管理
1 用户管理
在 Oracle 中,用户即 schema,拥有自己的对象集合。
-- 连接到管理员 (如 SYSTEM) -- 创建新用户 CREATE USER scott IDENTIFIED BY tiger; -- 删除用户 (如果用户有对象,需加上 CASCADE) DROP USER scott CASCADE;
2 权限与角色
直接授予用户权限会很繁琐,通常使用角色来管理权限集。
-- 1. 创建角色 CREATE ROLE developer_role; -- 2. 授予角色权限 GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO developer_role; -- 3. 将角色授予用户 GRANT developer_role TO scott; -- 4. 撤销权限 REVOKE CREATE VIEW FROM developer_role;
第六部分:数据备份与恢复
1 导出/导入
这是最常用的逻辑备份方式。
-
expdp(Data Pump Export)# 导出整个 SCOTT 用户的所有数据 expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp SCHEMAS=scott
(需要先在数据库中创建 DIRECTORY 对象并授权)
-
impdp(Data Pump Import)# 导入数据 impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp FULL=y
2 RMAN (Recovery Manager)
RMAN 是 Oracle 强大的物理备份工具,直接与数据库文件交互,是生产环境的首选。
-- 连接到 RMAN rman target / -- 连接到本地数据库 -- 执行备份 RMAN> BACKUP DATABASE PLUS ARCHIVELOG; -- 查看备份 RMAN> LIST BACKUP;
第七部分:性能调优基础
1 执行计划
执行计划是数据库引擎为执行 SQL 查询而制定的“操作计划”,分析它是优化的第一步。
-- 在 SQL*Plus 或 SQL Developer 中 EXPLAIN PLAN FOR SELECT * FROM emp WHERE salary > 5000; -- 查看执行计划 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
关注点:
TABLE ACCESS FULL: 全表扫描,通常很慢,应尽量避免。INDEX RANGE SCAN: 索引范围扫描,通常比全表扫描快。COST: 成本值,越小越好。
2 索引优化
确保在 WHERE 和 JOIN 条件中频繁使用的列上创建合适的索引,但并非越多越好,过多的索引会影响写入性能。
3 统计信息
Oracle 的优化器依赖统计信息来选择最佳执行计划,当数据量变化很大后,需要更新统计信息。
-- 收集整个数据库的统计信息
EXEC DBMS_STATS.GATHER_DATABASE_STATS;
-- 收集特定表的统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP');
第八部分:学习资源与最佳实践
1 官方文档
- Oracle Database Documentation: https://docs.oracle.com/en/database/
这是最权威、最全面的学习资料,涵盖了从入门到专家的所有内容。
2 推荐书籍
- 《Oracle Database 12c SQL》: 由 Jason Price 编写,非常适合初学者学习 SQL。
- 《Oracle PL/SQL Programming》: 由 Steven Feuerstein 编写,被誉为 PL/编程领域的“圣经”。
3 最佳实践
- 始终使用绑定变量: 在动态 SQL 中,使用
variable_name代替直接拼接字符串,可以共享游标,提高性能并防止 SQL 注入。 - *谨慎使用 `SELECT `**: 明确列出所需的列,提高可读性,避免不必要的 I/O。
- 为表和列添加注释: 使用
COMMENT ON TABLE ...和COMMENT ON COLUMN ...,让代码更具可维护性。 - 遵循命名规范: 统一的命名规范(如使用下划线分隔单词)能让数据库结构更清晰。
- 定期备份: 制定并严格执行备份策略,是数据库管理的重中之重。
- 监控性能: 关注慢查询,定期分析执行计划,持续优化。
这份教程为你提供了一个 Oracle 数据库学习的全景图,真正的掌握需要大量的实践,建议你安装好环境后,跟着示例一步步操作,并尝试构建自己的项目和练习,祝你学习顺利!
