一、基础概念与工具
| 项目 | 说明与用法 |
|---|---|
| DUAL 表 | 系统内置的单行单列虚拟表,常用于不依赖实际表的 SELECT 查询。 示例: SELECT SYSDATE FROM DUAL;📖 维基百科 |
| SQL*Plus | Oracle 命令行交互工具,支持环境命令、脚本执行和结果格式化。 📖 维基百科 |
| 快速参考文档 | Oracle 官方提供的《SQL Language Quick Reference》PDF,汇总语法、函数与格式模型。 🔗 官方文档 |
二、SQL*Plus 与环境命令
| 类别 | 命令示例 |
|---|---|
| 连接与退出 | sqlplus username/password@host:port/SIDEXIT / QUIT |
| 脚本执行 | @script.sql 或 START script.sql |
| 输出控制 | SET LINESIZE 200SET PAGESIZE 50SET HEADING ON |
| 列格式化 | COLUMN col_name FORMAT A20COLUMN col_name HEADING '列名' |
| 变量与参数 | SHOW PARAMETER sgaSHOW USERSHOW ALL |
| 结果导出 | SPOOL /path/to/output.logSPOOL OFF |
| 会话管理 | CONNECT new_user/password@service |
三、数据定义语言(DDL)
| 对象类型 | 语法示例 |
|---|---|
| 表管理 | sql<br>CREATE TABLE employees (<br> id NUMBER PRIMARY KEY,<br> name VARCHAR2(50)<br>) TABLESPACE users;<br>DROP TABLE employees PURGE; |
| 表结构修改 | ALTER TABLE employees ADD (email VARCHAR2(100));ALTER TABLE employees MODIFY (name VARCHAR2(100));ALTER TABLE employees RENAME COLUMN name TO full_name;ALTER TABLE employees DROP COLUMN email;ALTER TABLE employees RENAME TO staff; |
| 约束管理 | sql<br>ALTER TABLE employees <br>ADD CONSTRAINT pk_emp PRIMARY KEY (id);<br>ALTER TABLE employees DROP CONSTRAINT pk_emp; |
| 索引管理 | CREATE INDEX idx_name ON employees(name);DROP INDEX idx_name;ALTER INDEX idx_name REBUILD COMPUTE STATISTICS; |
| 视图 | CREATE OR REPLACE VIEW emp_view AS SELECT * FROM employees;DROP VIEW emp_view; |
| 序列 | CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1;DROP SEQUENCE emp_seq; |
| 同义词 | CREATE SYNONYM emp_syn FOR hr.employees;DROP SYNONYM emp_syn; |
| 表空间 | CREATE TABLESPACE tbs1 DATAFILE '/path/file.dbf' SIZE 100M;DROP TABLESPACE tbs1 INCLUDING CONTENTS AND DATAFILES; |
四、数据操作语言(DML)
| 操作类型 | 语法示例 |
|---|---|
| 数据插入 | INSERT INTO employees (id, name) VALUES (1, 'John');INSERT INTO emp_backup SELECT * FROM employees; |
| 数据更新 | UPDATE employees SET salary = 5000 WHERE id = 1; |
| 数据删除 | DELETE FROM employees WHERE id = 1; |
| 查询基础 | SELECT id, name FROM employees WHERE department = 'IT'; |
| 排序分页 | sql<br>-- 传统分页<br>SELECT * FROM (<br> SELECT t.*, ROWNUM rn FROM employees t<br>) WHERE rn BETWEEN 11 AND 20;<br><br>-- 12c+ 分页<br>SELECT * FROM employees <br>OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;<br> |
| 聚合分组 | SELECT dept, AVG(salary) FROM employees GROUP BY dept HAVING AVG(salary) > 5000; |
| 高级查询 | sql<br>-- 子查询<br>SELECT * FROM employees <br>WHERE salary > (SELECT AVG(salary) FROM employees);<br><br>-- WITH 子句<br>WITH dept_stats AS (<br> SELECT dept, AVG(salary) avg_sal FROM employees GROUP BY dept<br>)<br>SELECT * FROM dept_stats WHERE avg_sal > 5000;<br> |
| 合并操作 | sql<br>MERGE INTO employees t <br>USING new_employees s <br>ON (t.id = s.id)<br>WHEN MATCHED THEN UPDATE SET t.salary = s.salary<br>WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name);<br> |
| 返回子句 | DELETE FROM employees WHERE id = 1 RETURNING name INTO v_name; |
五、函数与表达式
| 函数类别 | 常用函数示例 |
|---|---|
| 字符串函数 | SUBSTR('Oracle', 2, 3) → 'rac'INSTR('Oracle', 'a') → 5UPPER('hello'), LOWER('WORLD')TRIM(' Hello ') → 'Hello'REPLACE('ABC', 'B', 'X') → 'AXC' |
| 数值函数 | ROUND(123.456, 2) → 123.46TRUNC(123.456, 2) → 123.45CEIL(123.1) → 124FLOOR(123.9) → 123 |
| 日期函数 | SYSDATE -- 当前日期TO_DATE('2024-01-01', 'YYYY-MM-DD')TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')ADD_MONTHS(SYSDATE, 3)MONTHS_BETWEEN(date1, date2) |
| 转换函数 | TO_CHAR(123) → '123'TO_NUMBER('123') → 123CAST('123' AS NUMBER) → 123 |
| 条件函数 | sql<br>CASE WHEN salary > 5000 THEN 'High'<br> ELSE 'Normal' <br>END<br>DECODE(status, 1, 'Active', 0, 'Inactive', 'Unknown') |
| 空值处理 | NVL(commission, 0)NVL2(commission, 'Has', 'None')COALESCE(phone, mobile, 'No Contact')NULLIF(salary, 0) |
| 分析函数 | sql<br>ROW_NUMBER() OVER (ORDER BY salary DESC)<br>RANK() OVER (PARTITION BY dept ORDER BY salary DESC)<br>LAG(salary) OVER (ORDER BY hire_date)<br> |
六、PL/SQL 编程
| 编程元素 | 语法结构 | ||
|---|---|---|---|
| 程序结构 | `sqlDECLARE v_name VARCHAR2(50); BEGIN SELECT name INTO v_name FROM employees WHERE id = 1; DBMS_OUTPUT.PUT_LINE('Name: ' | v_name); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Not found'); END; ` | |
| 流程控制 | sql<br>-- IF 语句<br>IF salary > 10000 THEN<br> bonus := 1000;<br>ELSIF salary > 5000 THEN<br> bonus := 500;<br>ELSE<br> bonus := 100;<br>END IF;<br><br>-- 循环<br>FOR i IN 1..10 LOOP<br> DBMS_OUTPUT.PUT_LINE(i);<br>END LOOP;<br><br>WHILE counter < 100 LOOP<br> counter := counter + 1;<br>END LOOP;<br> | ||
| 存储程序 | sql<br>CREATE OR REPLACE PROCEDURE raise_salary(<br> p_emp_id IN NUMBER,<br> p_amount IN NUMBER<br>) IS<br>BEGIN<br> UPDATE employees <br> SET salary = salary + p_amount <br> WHERE id = p_emp_id;<br> COMMIT;<br>END;<br><br>CREATE OR REPLACE FUNCTION get_employee_name(<br> p_emp_id IN NUMBER<br>) RETURN VARCHAR2 IS<br> v_name VARCHAR2(100);<br>BEGIN<br> SELECT name INTO v_name FROM employees WHERE id = p_emp_id;<br> RETURN v_name;<br>END;<br> | ||
| 包管理 | sql<br>CREATE OR REPLACE PACKAGE emp_pkg AS<br> PROCEDURE hire_employee(p_name VARCHAR2, p_salary NUMBER);<br> FUNCTION get_salary(p_emp_id NUMBER) RETURN NUMBER;<br>END emp_pkg;<br><br>CREATE OR REPLACE PACKAGE BODY emp_pkg AS<br> PROCEDURE hire_employee(p_name VARCHAR2, p_salary NUMBER) IS<br> BEGIN<br> INSERT INTO employees(name, salary) VALUES(p_name, p_salary);<br> END;<br> <br> FUNCTION get_salary(p_emp_id NUMBER) RETURN NUMBER IS<br> v_salary NUMBER;<br> BEGIN<br> SELECT salary INTO v_salary FROM employees WHERE id = p_emp_id;<br> RETURN v_salary;<br> END;<br>END emp_pkg;<br> | ||
| 触发器 | sql<br>CREATE OR REPLACE TRIGGER audit_employee<br>BEFORE UPDATE ON employees<br>FOR EACH ROW<br>BEGIN<br> INSERT INTO audit_log VALUES(:OLD.salary, :NEW.salary, SYSDATE);<br>END;<br> | ||
| 游标处理 | sql<br>DECLARE<br> CURSOR emp_cur IS SELECT id, name FROM employees;<br> v_id employees.id%TYPE;<br> v_name employees.name%TYPE;<br>BEGIN<br> OPEN emp_cur;<br> LOOP<br> FETCH emp_cur INTO v_id, v_name;<br> EXIT WHEN emp_cur%NOTFOUND;<br> -- 处理数据<br> END LOOP;<br> CLOSE emp_cur;<br>END;<br> |
七、事务与并发控制
| 事务操作 | 命令与说明 |
|---|---|
| 事务控制 | COMMIT; -- 提交事务ROLLBACK; -- 回滚事务SAVEPOINT sp1; -- 设置保存点ROLLBACK TO SAVEPOINT sp1; -- 回滚到保存点 |
| 并发控制 | SELECT ... FOR UPDATE; -- 行级锁定SELECT ... FOR UPDATE NOWAIT; -- 不等待锁LOCK TABLE employees IN EXCLUSIVE MODE; -- 表级锁 |
| 隔离级别 | Oracle 默认 READ COMMITTEDSET TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
| 锁监控 | 查询 V$LOCK, V$LOCKED_OBJECT, V$SESSION 视图 |
八、性能优化
| 优化技术 | 实施方法 |
|---|---|
| 执行计划 | sql<br>EXPLAIN PLAN FOR SELECT * FROM employees;<br>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);<br> |
| 统计信息 | sql<br>EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES');<br>EXEC DBMS_STATS.GATHER_SCHEMA_STATS('HR');<br> |
| 优化器提示 | SELECT /*+ INDEX(emp emp_idx) */ * FROM employees emp;SELECT /*+ FULL(emp) */ * FROM employees emp;SELECT /*+ PARALLEL(emp, 4) */ * FROM employees emp; |
| 索引优化 | ALTER INDEX emp_name_idx REBUILD;ALTER INDEX emp_name_idx MONITORING USAGE; |
| SQL 监控 | 查询 V$SQL, V$SQLAREA, V$SESSION_LONGOPS |
九、分区表技术
| 分区类型 | 创建语法 |
|---|---|
| 范围分区 | sql<br>CREATE TABLE sales (<br> sale_id NUMBER,<br> sale_date DATE,<br> amount NUMBER<br>) PARTITION BY RANGE (sale_date) (<br> PARTITION p2023 VALUES LESS THAN (DATE '2024-01-01'),<br> PARTITION p2024 VALUES LESS THAN (DATE '2025-01-01'),<br> PARTITION p_max VALUES LESS THAN (MAXVALUE)<br>);<br> |
| 列表分区 | sql<br>CREATE TABLE customers (<br> customer_id NUMBER,<br> region VARCHAR2(20)<br>) PARTITION BY LIST (region) (<br> PARTITION p_east VALUES ('Beijing', 'Shanghai'),<br> PARTITION p_west VALUES ('Chengdu', 'Chongqing')<br>);<br> |
| 哈希分区 | sql<br>CREATE TABLE logs (<br> log_id NUMBER,<br> log_message VARCHAR2(4000)<br>) PARTITION BY HASH (log_id) PARTITIONS 4;<br> |
| 组合分区 | sql<br>CREATE TABLE transactions (<br> trans_id NUMBER,<br> trans_date DATE,<br> amount NUMBER<br>) PARTITION BY RANGE (trans_date)<br>SUBPARTITION BY HASH (trans_id) SUBPARTITIONS 4 (<br> PARTITION p2023 VALUES LESS THAN (DATE '2024-01-01'),<br> PARTITION p2024 VALUES LESS THAN (DATE '2025-01-01')<br>);<br> |
| 分区维护 | ALTER TABLE sales ADD PARTITION p2025 VALUES LESS THAN (...);ALTER TABLE sales DROP PARTITION p2020;ALTER TABLE sales TRUNCATE PARTITION p2024;ALTER TABLE sales EXCHANGE PARTITION p2024 WITH TABLE stage_sales; |
十、索引技术
| 索引类型 | 特性与创建语法 |
|---|---|
| B-tree 索引 | CREATE INDEX emp_name_idx ON employees(last_name); |
| 位图索引 | CREATE BITMAP INDEX emp_gender_idx ON employees(gender); |
| 函数索引 | CREATE INDEX emp_upper_name_idx ON employees(UPPER(last_name)); |
| 反向键索引 | CREATE INDEX emp_id_rev_idx ON employees(id) REVERSE; |
| 压缩索引 | CREATE INDEX emp_comp_idx ON employees(dept_id, hire_date) COMPRESS 1; |
| 分区索引 | sql<br>CREATE INDEX sales_date_idx ON sales(sale_date)<br>LOCAL (<br> PARTITION p2023,<br> PARTITION p2024<br>);<br> |
十一、物化视图
| 操作 | 语法示例 |
|---|---|
| 创建物化视图 | sql<br>CREATE MATERIALIZED VIEW sales_summary_mv<br>REFRESH FAST ON COMMIT<br>AS<br>SELECT region, SUM(amount) total_sales<br>FROM sales <br>GROUP BY region;<br> |
| 创建物化视图日志 | sql<br>CREATE MATERIALIZED VIEW LOG ON sales <br>WITH ROWID, SEQUENCE(region, amount) <br>INCLUDING NEW VALUES;<br> |
| 刷新操作 | EXEC DBMS_MVIEW.REFRESH('SALES_SUMMARY_MV', 'C');EXEC DBMS_MVIEW.REFRESH('SALES_SUMMARY_MV', 'F'); |
| 监控信息 | SELECT mview_name, refresh_mode, last_refresh_date FROM user_mviews; |
十二、安全管理
| 安全功能 | 命令示例 |
|---|---|
| 用户与权限 | CREATE USER john IDENTIFIED BY password;GRANT CREATE SESSION, CREATE TABLE TO john;GRANT SELECT, INSERT ON hr.employees TO john;REVOKE DELETE ON hr.employees FROM john; |
| 角色管理 | CREATE ROLE report_user;GRANT SELECT ANY TABLE TO report_user;GRANT report_user TO john; |
| 审计 | AUDIT SELECT TABLE BY ACCESS;AUDIT INSERT, UPDATE ON hr.employees;NOAUDIT SELECT TABLE; |
| 数据加密 | ALTER TABLE employees MODIFY (ssn ENCRYPT USING 'AES256'); |
十三、系统视图
| 视图类别 | 常用视图 |
|---|---|
| 数据字典 | USER_TABLES, USER_INDEXES, USER_CONSTRAINTSALL_TABLES, ALL_OBJECTSDBA_USERS, DBA_TABLESPACES, DBA_DATA_FILES |
| 性能视图 | V$SESSION, V$SQL, V$SQLAREAV$LOCK, V$PROCESSV$SGAINFO, V$PGASTATV$SYSTEM_EVENT, V$SESSION_WAIT |
| 存储监控 | DBA_FREE_SPACE, DBA_SEGMENTSDBA_EXTENTS, DBA_DATA_FILES |
十四、备份与恢复
| 备份方式 | 操作命令 |
|---|---|
| Data Pump 导出 | expdp hr/password DIRECTORY=dpump_dir DUMPFILE=hr_backup.dmp SCHEMAS=hr |
| Data Pump 导入 | impdp hr/password DIRECTORY=dpump_dir DUMPFILE=hr_backup.dmp REMAP_SCHEMA=hr:hr_new |
| RMAN 备份 | sql<br>RMAN> BACKUP DATABASE PLUS ARCHIVELOG;<br>RMAN> BACKUP TABLESPACE users;<br>RMAN> BACKUP CURRENT CONTROLFILE;<br> |
| RMAN 恢复 | sql<br>RMAN> RESTORE DATABASE;<br>RMAN> RECOVER DATABASE;<br> |
| 闪回技术 | sql<br>FLASHBACK TABLE employees TO TIMESTAMP SYSDATE - 1/24;<br>SELECT * FROM employees AS OF TIMESTAMP SYSDATE - 5/1440;<br>FLASHBACK DATABASE TO TIMESTAMP SYSDATE - 1;<br> |
十五、高级特性
| 特性 | 描述与示例 |
|---|---|
| 数据库链接 | CREATE DATABASE LINK remote_db CONNECT TO user IDENTIFIED BY password USING 'tns_alias';SELECT * FROM employees@remote_db; |
| 多租户架构 | ALTER SESSION SET CONTAINER = PDB1;SHOW CON_NAMESELECT NAME, OPEN_MODE FROM V$PDBS; |
| 调度任务 | sql<br>BEGIN<br> DBMS_SCHEDULER.CREATE_JOB(<br> job_name => 'nightly_report',<br> job_type => 'PLSQL_BLOCK',<br> job_action => 'BEGIN generate_report; END;',<br> start_date => SYSTIMESTAMP,<br> repeat_interval => 'FREQ=DAILY;BYHOUR=2',<br> enabled => TRUE<br> );<br>END;<br> |
| 高级数据类型 | 集合类型、XMLType、空间数据类型、JSON 支持 |