一、基础概念与工具
项目 | 说明与用法 |
---|---|
DUAL 表 | 系统内置的单行单列虚拟表,常用于不依赖实际表的 SELECT 查询。 示例: SELECT SYSDATE FROM DUAL; 📖 维基百科 |
SQL*Plus | Oracle 命令行交互工具,支持环境命令、脚本执行和结果格式化。 📖 维基百科 |
快速参考文档 | Oracle 官方提供的《SQL Language Quick Reference》PDF,汇总语法、函数与格式模型。 🔗 官方文档 |
二、SQL*Plus 与环境命令
类别 | 命令示例 |
---|---|
连接与退出 | sqlplus username/password@host:port/SID EXIT / QUIT |
脚本执行 | @script.sql 或 START script.sql |
输出控制 | SET LINESIZE 200 SET PAGESIZE 50 SET HEADING ON |
列格式化 | COLUMN col_name FORMAT A20 COLUMN col_name HEADING '列名' |
变量与参数 | SHOW PARAMETER sga SHOW USER SHOW ALL |
结果导出 | SPOOL /path/to/output.log SPOOL 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_CONSTRAINTS ALL_TABLES , ALL_OBJECTS DBA_USERS , DBA_TABLESPACES , DBA_DATA_FILES |
性能视图 | V$SESSION , V$SQL , V$SQLAREA V$LOCK , V$PROCESS V$SGAINFO , V$PGASTAT V$SYSTEM_EVENT , V$SESSION_WAIT |
存储监控 | DBA_FREE_SPACE , DBA_SEGMENTS DBA_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_NAME SELECT 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 支持 |