
Oracle 数据库的命令体系庞大,按功能模块可划分为 连接与退出、用户与权限管理、表结构操作、数据操纵、查询优化、事务控制、存储过程与函数、数据库维护 等核心模块。以下按模块整理常用基本命令,并标注关键说明,便于理解和使用。
一、连接与退出数据库(基础入口)
连接 Oracle 需通过客户端工具(如 sqlplus
、PL/SQL Developer),核心命令用于建立会话或断开连接,是所有操作的前提。
命令 | 功能说明 | 示例 |
---|---|---|
sqlplus 用户名/密码 |
本地连接数据库(默认端口 1521) | sqlplus scott/tiger (经典示例用户) |
sqlplus 用户名/密码@服务名 |
远程连接(需配置 tnsnames.ora ) |
sqlplus scott/tiger@orcl (orcl 为服务名) |
sqlplus / as sysdba |
以 超级管理员(SYS) 身份登录(本地特权) | 无需密码,直接进入最高权限模式 |
conn 用户名/密码 |
会话内切换用户(无需重新打开 sqlplus) | conn sys/change_on_install as sysdba (切换为 SYS) |
disconnect |
断开当前会话连接(保留 sqlplus 窗口) | 断开后需重新 conn 连接 |
exit / quit |
退出 sqlplus 客户端 | 执行后关闭命令行窗口 |
二、用户与权限管理(安全控制)
Oracle 基于 "用户 - 角色 - 权限" 的三层模型管理访问权限,核心是创建用户、分配角色 / 权限,保障数据安全。
1. 用户管理命令
命令 | 功能说明 | 示例 |
---|---|---|
CREATE USER 用户名 IDENTIFIED BY 密码; |
创建新用户(初始无任何权限) | CREATE USER test_user IDENTIFIED BY Test123; |
ALTER USER 用户名 IDENTIFIED BY 新密码; |
修改用户密码 | ALTER USER test_user IDENTIFIED BY NewTest456; |
DROP USER 用户名; |
删除用户(需无依赖对象) | DROP USER test_user; |
DROP USER 用户名 CASCADE; |
强制删除用户(含其所有对象,如表、视图) | DROP USER test_user CASCADE; |
ALTER USER 用户名 ACCOUNT LOCK; |
锁定用户(禁止登录) | ALTER USER test_user ACCOUNT LOCK; |
ALTER USER 用户名 ACCOUNT UNLOCK; |
解锁用户 | ALTER USER test_user ACCOUNT UNLOCK; |
2. 权限与角色管理
- 权限分类 :
- 系统权限:数据库级操作(如
CREATE TABLE
、DROP USER
); - 对象权限:对特定对象的操作(如查询他人表
SELECT ON 表名
)。
- 系统权限:数据库级操作(如
- 常用角色 :Oracle 预定义角色(简化权限分配),如
CONNECT
(基础连接权限)、RESOURCE
(创建表 / 索引等对象权限)、DBA
(超级权限,慎用)。
命令 | 功能说明 | 示例 |
---|---|---|
GRANT 角色/权限 TO 用户名; |
授予用户角色或权限 | GRANT CONNECT, RESOURCE TO test_user; (授予基础角色) |
GRANT SELECT ON 表名 TO 用户名; |
授予用户对指定表的查询权限 | GRANT SELECT ON scott.emp TO test_user; (允许 test_user 查 scott 的 emp 表) |
REVOKE 角色/权限 FROM 用户名; |
回收用户的角色或权限 | REVOKE RESOURCE FROM test_user; (回收创建对象的权限) |
REVOKE UPDATE ON 表名 FROM 用户名; |
回收对指定表的更新权限 | REVOKE UPDATE ON scott.emp FROM test_user; |
SELECT * FROM DBA_USERS; |
查看所有用户信息(需 DBA 权限) | - |
SELECT * FROM USER_SYS_PRIVS; |
查看当前用户的系统权限 | - |
三、表结构操作(DDL:数据定义语言)
用于创建、修改、删除表及表的约束(如主键、外键),属于 "结构级" 操作,执行后立即生效(无需提交)。
1. 表的创建(CREATE TABLE)
核心语法:CREATE TABLE 表名 (列名 数据类型 [约束] [默认值], ...);
常用数据类型:VARCHAR2(n)
(字符串,n 为最大长度)、NUMBER(p,s)
(数值,p 总位数,s 小数位)、DATE
(日期)、CLOB
(大文本)。
命令 | 功能说明 | 示例 |
---|---|---|
CREATE TABLE 表名(列1 类型, 列2 类型); |
基础建表(无约束) | CREATE TABLE student (id NUMBER, name VARCHAR2(20), birth DATE); |
CREATE TABLE 表名(列1 类型 PRIMARY KEY, 列2 类型); |
建表时指定主键(唯一标识行) | CREATE TABLE student (id NUMBER PRIMARY KEY, name VARCHAR2(20)); (id 为主键) |
CREATE TABLE 表名(列1 类型, 列2 类型, FOREIGN KEY(列2) REFERENCES 主表(主表列)); |
建表时指定外键(关联主表) | CREATE TABLE score (stu_id NUMBER, score NUMBER, FOREIGN KEY(stu_id) REFERENCES student(id)); (stu_id 关联 student 的 id) |
2. 表的修改(ALTER TABLE)
命令 | 功能说明 | 示例 |
---|---|---|
ALTER TABLE 表名 ADD (列名 类型); |
给表新增列 | ALTER TABLE student ADD (gender CHAR(1)); (新增性别列,1 字符) |
ALTER TABLE 表名 MODIFY (列名 新类型); |
修改列的数据类型(需注意数据兼容性) | ALTER TABLE student MODIFY (name VARCHAR2(30)); (姓名长度从 20 改为 30) |
ALTER TABLE 表名 DROP COLUMN 列名; |
删除表的某一列 | ALTER TABLE student DROP COLUMN gender; |
ALTER TABLE 表名 RENAME TO 新表名; |
重命名表 | ALTER TABLE student RENAME TO stu; |
3. 表的删除与清空
命令 | 功能说明 | 区别 |
---|---|---|
DROP TABLE 表名; |
删除表(结构 + 数据全删,无法恢复) | 彻底删除,释放存储空间 |
TRUNCATE TABLE 表名; |
清空表数据(保留表结构,无法恢复) | 比 DELETE 快(不写日志),不能回滚 |
四、数据操纵(DML:数据操纵语言)
用于对表中数据进行 增、删、改 ,操作后需执行 COMMIT
提交才生效,ROLLBACK
可回滚未提交的操作。
命令 | 功能说明 | 示例 |
---|---|---|
INSERT INTO 表名(列1,列2) VALUES(值1,值2); |
插入单行数据 | INSERT INTO student(id,name) VALUES(1,'张三'); |
INSERT INTO 表名 SELECT 列1,列2 FROM 其他表; |
从其他表批量插入数据 | INSERT INTO stu_back SELECT * FROM student; (备份 student 数据到 stu_back) |
UPDATE 表名 SET 列1=值1,列2=值2 WHERE 条件; |
修改符合条件的数据(无 WHERE 则改全表) | UPDATE student SET name='李四' WHERE id=1; (修改 id=1 的姓名) |
DELETE FROM 表名 WHERE 条件; |
删除符合条件的数据(无 WHERE 则删全表) | DELETE FROM student WHERE id=1; (删除 id=1 的行) |
COMMIT; |
提交当前会话的 DML 操作(永久生效) | 执行后数据无法通过 ROLLBACK 回滚 |
ROLLBACK; |
回滚当前会话未提交的 DML 操作 | 如插入后未提交,执行后数据恢复到插入前 |
五、数据查询(DQL:数据查询语言)
通过 SELECT
语句从表中提取数据,是 Oracle 最核心、最灵活的命令,支持多表关联、过滤、排序、聚合等。
1. 基础查询
命令 | 功能说明 | 示例 |
---|---|---|
SELECT 列1,列2 FROM 表名; |
查询指定列的所有数据 | SELECT id,name FROM student; |
SELECT * FROM 表名; |
查询表的所有列(不推荐生产环境,效率低) | SELECT * FROM student; |
SELECT 列1,列2 FROM 表名 WHERE 条件; |
过滤查询(只查符合条件的数据) | SELECT * FROM student WHERE id>10; (查 id>10 的学生) |
SELECT 列1,列2 FROM 表名 ORDER BY 列1 [ASC/DESC]; |
排序查询(ASC 升序,默认;DESC 降序) | SELECT * FROM student ORDER BY id DESC; (按 id 降序) |
2. 高级查询(常用扩展)
-
聚合函数 :对数据分组计算,如
COUNT()
(计数)、SUM()
(求和)、AVG()
(平均值)、MAX()
(最大值)。示例:SELECT COUNT(*) 总人数, AVG(score) 平均分 FROM student;
-
分组查询 :
GROUP BY
按指定列分组,搭配聚合函数使用。示例:SELECT class_id, COUNT(*) 班级人数 FROM student GROUP BY class_id;
-
多表关联 :
JOIN
关联多个表(内连接、左连接等)。示例:SELECT s.name, sc.score FROM student s JOIN score sc ON s.id = sc.stu_id;
(查学生姓名和对应分数) -
分页查询 :Oracle 用
ROWNUM
实现(需嵌套子查询),如查第 11-20 条数据:sql
SELECT * FROM ( SELECT ROWNUM rn, id, name FROM student WHERE ROWNUM <=20 ) WHERE rn >=11;
六、事务控制(保障数据一致性)
Oracle 事务遵循 ACID 原则(原子性、一致性、隔离性、持久性),核心命令用于控制事务的提交、回滚和保存点。
命令 | 功能说明 | 示例 |
---|---|---|
COMMIT; |
提交事务(所有 DML 操作永久生效) | 插入 10 条数据后执行 COMMIT ,数据写入磁盘 |
ROLLBACK; |
回滚事务(撤销所有未提交的 DML 操作) | 误删数据后未提交,执行 ROLLBACK 恢复 |
SAVEPOINT 保存点名称; |
设置事务保存点(可回滚到指定点,不影响保存点前的操作) | ```sql |
INSERT INTO student VALUES (1,' 张三 '); | ||
SAVEPOINT sp1; -- 设置保存点 | ||
INSERT INTO student VALUES (2,' 李四 '); | ||
ROLLBACK TO sp1; -- 回滚到 sp1,仅删除 "李四" 的记录,"张三" 保留 | ||
COMMIT; -- 最终仅提交 "张三" 的记录 |
|
| `SET TRANSACTION ISOLATION LEVEL 隔离级别;` | 设置事务隔离级别(如 `READ COMMITTED` 默认、`SERIALIZABLE`) | 控制并发时的数据可见性,避免脏读、幻读 |
# 七、存储过程与函数(PL/SQL 编程)
Oracle 支持 PL/SQL 语言,可编写 **存储过程(无返回值)** 和 **函数(有返回值)**,用于封装复杂逻辑(如批量处理数据),提高执行效率。
## 1. 存储过程(PROCEDURE)
```sql
-- 创建存储过程:批量插入学生数据
CREATE OR REPLACE PROCEDURE insert_student(
p_id NUMBER, -- 输入参数:学生ID
p_name VARCHAR2 -- 输入参数:学生姓名
) AS
BEGIN
INSERT INTO student(id, name) VALUES(p_id, p_name);
COMMIT; -- 内部提交(也可外部提交)
EXCEPTION
WHEN OTHERS THEN
ROLLBACK; -- 异常时回滚
DBMS_OUTPUT.PUT_LINE('插入失败:' || SQLERRM); -- 输出错误信息
END;
/
-- 调用存储过程
CALL insert_student(3, '王五'); -- 方式1
EXEC insert_student(4, '赵六'); -- 方式2(sqlplus 支持)
2. 函数(FUNCTION)
sql
-- 创建函数:根据学生ID查询姓名
CREATE OR REPLACE FUNCTION get_student_name(
p_id NUMBER -- 输入参数:学生ID
) RETURN VARCHAR2 -- 定义返回值类型
AS
v_name VARCHAR2(20); -- 局部变量
BEGIN
SELECT name INTO v_name FROM student WHERE id = p_id;
RETURN v_name; -- 返回结果
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN '无此学生'; -- 无数据时返回提示
END;
/
-- 调用函数
SELECT get_student_name(3) FROM DUAL; -- DUAL 是 Oracle 虚拟表,用于无表查询
八、数据库维护命令(监控与管理)
用于查看数据库状态、会话信息、表空间等,辅助运维和问题排查(需对应权限)。
命令 | 功能说明 | 示例 |
---|---|---|
SELECT * FROM V$INSTANCE; |
查看数据库实例状态(如 OPEN 表示正常运行) |
- |
SELECT * FROM V$SESSION; |
查看所有当前会话(谁在连接数据库) | SELECT username, status FROM V$SESSION WHERE username IS NOT NULL; |
SELECT * FROM USER_TABLES; |
查看当前用户的所有表 | - |
SELECT * FROM USER_INDEXES; |
查看当前用户的所有索引(索引用于加速查询) | - |
ANALYZE TABLE 表名 COMPUTE STATISTICS; |
收集表的统计信息(帮助 Oracle 优化查询计划) | ANALYZE TABLE student COMPUTE STATISTICS; |
SHOW PARAMETER 参数名; |
查看数据库参数(如端口、字符集) | SHOW PARAMETER port; (查看监听端口) |
关键注意事项
- 命令结尾 :Oracle 命令需以
;
结束(PL/SQL 块以/
结束); - 大小写敏感 :默认情况下,Oracle 对表名、列名不区分大小写(会自动转为大写),但字符串值区分大小写(如
WHERE name='张三'
不等于'张三 '
); - 权限控制 :大部分操作需对应权限(如
CREATE TABLE
需RESOURCE
角色,DROP USER
需DBA
权限),避免滥用SYS
用户; - 事务特性 :DML 操作(增删改)需
COMMIT
生效,DDL
操作(建表、删表)会自动提交事务,无需手动执行COMMIT
。