以下是一份全面的 Oracle 数据库常用 SQL 命令集合,涵盖数据库管理、对象操作、数据查询优化等核心功能:
一、数据库连接与基本信息
sql复制代码
sql
-- 连接到数据库
CONNECT username/password@service_name
-- 查看当前用户
SHOW USER
-- 查看数据库版本
SELECT * FROM v$version;
-- 查看实例状态
SELECT instance_name, status, database_status FROM v$instance;
二、表空间管理
sql复制代码
sql
-- 查看表空间
SELECT tablespace_name, status, contents FROM dba_tablespaces;
-- 创建表空间
CREATE TABLESPACE my_ts
DATAFILE '/u01/oradata/mydb/my_ts01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
-- 扩展表空间
ALTER TABLESPACE my_ts ADD DATAFILE
'/u01/oradata/mydb/my_ts02.dbf' SIZE 50M;
-- 修改用户默认表空间
ALTER USER scott DEFAULT TABLESPACE my_ts;
三、用户与权限
sql复制代码
sql
-- 创建用户
CREATE USER dev_user IDENTIFIED BY "Str0ngP@ss"
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users;
-- 授予权限
GRANT CREATE SESSION, CREATE TABLE TO dev_user;
GRANT SELECT, INSERT ON hr.employees TO dev_user;
-- 创建角色
CREATE ROLE data_analyst;
GRANT SELECT ANY TABLE, CREATE VIEW TO data_analyst;
-- 查看用户权限
SELECT * FROM dba_sys_privs WHERE grantee = 'DEV_USER';
四、表管理
1. 创建表
sql复制代码
sql
CREATE TABLE employees (
emp_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
first_name VARCHAR2(50) NOT NULL,
last_name VARCHAR2(50),
hire_date DATE DEFAULT SYSDATE,
salary NUMBER(10,2),
dept_id NUMBER,
CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
) TABLESPACE users;
2. 修改表结构
sql复制代码
sql
-- 添加列
ALTER TABLE employees ADD (phone VARCHAR2(15));
-- 修改列
ALTER TABLE employees MODIFY (salary NUMBER(12,2));
-- 重命名列
ALTER TABLE employees RENAME COLUMN phone TO mobile;
-- 删除列
ALTER TABLE employees DROP COLUMN mobile;
3. 表维护
sql复制代码
sql
-- 重命名表
RENAME employees TO staff;
-- 截断表
TRUNCATE TABLE temp_data;
-- 删除表
DROP TABLE employees PURGE; -- 彻底删除
五、数据操作 (CRUD)
1. 插入数据
sql复制代码
sql
-- 插入单行
INSERT INTO employees (first_name, last_name, salary)
VALUES ('John', 'Doe', 5000);
-- 插入多行
INSERT ALL
INTO employees (first_name, last_name) VALUES ('Alice', 'Smith')
INTO employees (first_name, last_name) VALUES ('Bob', 'Johnson')
SELECT 1 FROM dual;
-- 从查询插入
INSERT INTO managers
SELECT * FROM employees WHERE salary > 8000;
2. 查询数据
sql复制代码
sql
-- 分页查询 (12c+)
SELECT * FROM employees
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- 正则表达式查询
SELECT * FROM employees
WHERE REGEXP_LIKE(first_name, '^Ste(v|ph)en$');
-- 层次查询
SELECT LPAD(' ', 2*(LEVEL-1)) || last_name AS org_chart
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR emp_id = manager_id;
-- 分析函数
SELECT dept_id, AVG(salary) AS avg_sal,
RANK() OVER (ORDER BY AVG(salary) DESC) dept_rank
FROM employees
GROUP BY dept_id;
3. 更新数据
sql复制代码
sql
-- 关联更新
UPDATE employees e
SET salary = salary * 1.1
WHERE EXISTS (
SELECT 1 FROM departments d
WHERE d.dept_id = e.dept_id AND d.location = 'NEW YORK'
);
-- 使用MERGE更新或插入
MERGE INTO bonuses b
USING (
SELECT emp_id, salary, dept_id
FROM employees
WHERE hire_date > DATE '2020-01-01'
) e
ON (b.emp_id = e.emp_id)
WHEN MATCHED THEN UPDATE SET b.bonus = e.salary * 0.1
WHEN NOT MATCHED THEN INSERT (b.emp_id, b.bonus)
VALUES (e.emp_id, e.salary * 0.15);
4. 删除数据
sql复制代码
sql
-- 关联删除
DELETE FROM employees e
WHERE dept_id IN (
SELECT dept_id FROM departments
WHERE location = 'CLOSED'
);
六、索引管理
sql复制代码
sql
-- 创建B-tree索引
CREATE INDEX idx_emp_name ON employees(last_name);
-- 创建位图索引
CREATE BITMAP INDEX idx_emp_dept ON employees(dept_id);
-- 创建函数索引
CREATE INDEX idx_emp_upper ON employees(UPPER(first_name));
-- 重建索引
ALTER INDEX idx_emp_name REBUILD ONLINE;
-- 监控索引使用
SELECT * FROM v$object_usage WHERE index_name = 'IDX_EMP_NAME';
七、PL/SQL 基础
sql复制代码
sql
-- 匿名块
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM employees;
DBMS_OUTPUT.PUT_LINE('Total employees: ' || v_count);
-- 异常处理
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found');
END;
/
-- 创建存储过程
CREATE OR REPLACE PROCEDURE increase_salary (
p_dept_id IN NUMBER,
p_percent IN NUMBER
) AS
BEGIN
UPDATE employees
SET salary = salary * (1 + p_percent/100)
WHERE dept_id = p_dept_id;
COMMIT;
END increase_salary;
/
八、性能优化
sql复制代码
sql
-- 执行计划分析
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE dept_id = 10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES');
-- SQL调优顾问
DECLARE
tune_task VARCHAR2(30);
BEGIN
tune_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text => 'SELECT * FROM employees WHERE salary > :1',
bind_list => sql_binds(anydata.ConvertNumber(5000)),
user_name => 'HR',
scope => 'COMPREHENSIVE',
time_limit => 60
);
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(tune_task);
END;
/
九、系统管理
sql复制代码
sql
-- 查看锁信息
SELECT * FROM v$locked_object;
-- 查看会话
SELECT sid, serial#, username, status FROM v$session;
-- 终止会话
ALTER SYSTEM KILL SESSION '123,4567'; -- sid, serial#
-- 表空间使用情况
SELECT tablespace_name,
ROUND(SUM(bytes) / 1024/1024) total_mb,
ROUND(SUM(bytes - NVL(free_bytes,0)) / 1024/1024) used_mb
FROM dba_data_files
LEFT JOIN (SELECT tablespace_name ts, SUM(bytes) free_bytes
FROM dba_free_space GROUP BY tablespace_name)
USING (tablespace_name)
GROUP BY tablespace_name;
十、数据字典视图
sql复制代码
sql
-- 查看表结构
DESC user_tab_columns;
SELECT column_name, data_type, nullable
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES';
-- 查看约束
SELECT constraint_name, constraint_type
FROM user_constraints
WHERE table_name = 'EMPLOYEES';
-- 查看索引
SELECT index_name, column_name
FROM user_ind_columns
WHERE table_name = 'EMPLOYEES';
-- 查看对象依赖
SELECT * FROM user_dependencies
WHERE referenced_name = 'EMPLOYEES';
十一、备份与恢复
sql复制代码
sql
-- 数据泵导出 (命令行)
expdp system/password DIRECTORY=data_pump_dir DUMPFILE=hr.dmp SCHEMAS=hr
-- 数据泵导入
impdp system/password DIRECTORY=data_pump_dir DUMPFILE=hr.dmp REMAP_SCHEMA=hr:new_hr
-- RMAN备份 (命令行)
rman TARGET /
BACKUP DATABASE PLUS ARCHIVELOG;
Oracle 特色功能提醒:
-
高级分区 :支持范围、列表、哈希、复合分区
sql复制代码
sqlCREATE TABLE sales ( sale_id NUMBER, sale_date DATE, amount NUMBER ) PARTITION BY RANGE (sale_date) ( PARTITION p2022 VALUES LESS THAN (DATE '2023-01-01'), PARTITION p2023 VALUES LESS THAN (MAXVALUE) );
-
虚拟列 :
sql复制代码
sqlALTER TABLE employees ADD (name_caps VARCHAR2(100) GENERATED ALWAYS AS (UPPER(first_name || ' ' || last_name)));
-
闪回技术 :
sql复制代码
sql-- 查询历史数据 SELECT * FROM employees AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '1' HOUR; -- 恢复被删除的表 FLASHBACK TABLE employees TO BEFORE DROP;
-
结果缓存 :
sql复制代码
sqlSELECT /*+ RESULT_CACHE */ AVG(salary) FROM employees;
重要提示:
- Oracle 区分大小写(除非使用双引号)
- 使用
COMMIT
提交事务,ROLLBACK
回滚- 生产环境操作前建议使用
SAVEPOINT
- 使用 SQL*Plus 时,以分号
;
或/
结束语句- 注意 Oracle 中的空值处理(
NULL
参与运算结果通常为NULL
)