连接与断开
这是使用 Oracle 数据库的第一步。
| 命令 |
描述 |
示例 |
conn[ect] |
连接到数据库。 |
conn scott/tiger@orcl conn / as sysdba (以管理员身份登录) |
passw[ord] |
修改当前用户的密码。 |
password scott |
disc[onnect] |
断开与当前数据库的连接。 |
disconnect |
exit / quit |
退出 SQL*Plus 会话。 |
exit |
数据操作语言
这是最核心的命令,用于操作表中的数据。
| 命令 |
描述 |
示例 |
SELECT |
从表中查询数据。 |
SELECT * FROM emp; SELECT ename, sal FROM emp WHERE deptno = 10; |
INSERT |
向表中插入新数据。 |
INSERT INTO emp (empno, ename, sal) VALUES (7900, 'SMITH', 1000); |
UPDATE |
更新表中的现有数据。 |
UPDATE emp SET sal = 1500 WHERE ename = 'SMITH'; |
DELETE |
从表中删除数据。 |
DELETE FROM emp WHERE ename = 'SMITH'; |
COMMIT |
提交当前事务,使更改永久生效。 |
COMMIT; |
ROLLBACK |
回滚当前事务,撤销未提交的更改。 |
ROLLBACK; |
数据定义语言
用于定义和管理数据库结构,如创建、修改、删除表等。
| 命令 |
描述 |
示例 |
CREATE |
创建数据库对象,如表、索引、视图等。 |
CREATE TABLE my_table (id NUMBER, name VARCHAR2(50)); |
ALTER |
修改现有数据库对象的结构。 |
ALTER TABLE my_table ADD (email VARCHAR2(100)); ALTER TABLE my_table MODIFY (name VARCHAR2(100)); |
DROP |
删除数据库对象。 |
DROP TABLE my_table; |
TRUNCATE |
快速清空表中的所有数据,但保留表结构。此操作不可回滚。 |
TRUNCATE TABLE my_table; |
RENAME |
重命名一个表。 |
RENAME my_table TO new_table; |
事务控制
确保数据的一致性和完整性。
| 命令 |
描述 |
示例 |
COMMIT |
提交当前事务。 |
COMMIT; |
ROLLBACK |
回滚当前事务到上一个 COMMIT 或 SAVEPOINT 点。 |
ROLLBACK; |
SAVEPOINT |
在当前事务中设置一个保存点。 |
INSERT ...; SAVEPOINT my_save; INSERT ...; ROLLBACK TO my_save; (回滚到第二个插入之前) |
SET TRANSACTION |
设置事务的属性,如只读模式。 |
SET TRANSACTION READ ONLY; |
数据查询语言进阶
更强大的查询功能。
| 命令/子句 |
描述 |
示例 |
DISTINCT |
消除查询结果中的重复行。 |
SELECT DISTINCT deptno FROM emp; |
WHERE |
过滤查询结果。 |
SELECT * FROM emp WHERE sal > 2000; |
ORDER BY |
对查询结果进行排序。 |
SELECT * FROM emp ORDER BY sal DESC; (降序) |
GROUP BY |
对结果进行分组。 |
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno; |
HAVING |
对分组后的结果进行过滤。 |
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2500; |
JOIN |
连接两个或多个表。 |
SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno; |
UNION / UNION ALL |
合并两个查询的结果。UNION 会去重,UNION ALL 不会。 |
SELECT deptno FROM emp UNION SELECT deptno FROM dept; |
INTERSECT |
返回两个查询结果的交集。 |
SELECT empno FROM emp INTERSECT SELECT empno from bonus; |
MINUS |
返回在第一个查询中但不在第二个查询中的结果。 |
SELECT empno FROM emp MINUS SELECT empno from bonus; |
SQL*Plus 环境控制
控制 SQL*Plus 的输出格式和行为。
| 命令 |
描述 |
示例 |
SET |
设置 SQL*Plus 的各种选项。 |
SET PAGESIZE 100 (设置每页显示的行数) SET LINESIZE 120 (设置每行的显示宽度) SET ECHO ON (显示脚本中的命令) SET FEEDBACK ON (显示查询返回的行数) |
DESC[RIBE] |
描述表的结构(列名、数据类型、是否为空等)。 |
DESC emp; |
SPO[OL] |
将输出结果保存到文件中。 |
SPOOL C:\output.txt SELECT * FROM emp; SPO OFF |
CLEAR SCR[EEN] |
清空 SQL*Plus 屏幕。 |
CLEAR SCREEN |
HO[ST] |
执行操作系统命令。 |
HOST dir (在 Windows 上查看目录) HOST ls -l (在 Linux 上列出文件) |
|
运行一个 SQL 脚本文件。 |
@C:\scripts\create_emp.sql |
用户与权限管理
通常由 DBA(数据库管理员)执行,但开发人员也需要了解。
| 命令 |
描述 |
示例 |
CREATE USER |
创建一个新用户。 |
CREATE USER myuser IDENTIFIED BY mypassword; |
GRANT |
授予用户权限或角色。 |
GRANT CONNECT, RESOURCE TO myuser; GRANT SELECT ON emp TO myuser; |
REVOKE |
撤销用户的权限或角色。 |
REVOKE SELECT ON emp FROM myuser; |
ALTER USER |
修改用户属性,如密码或默认表空间。 |
ALTER USER myuser IDENTIFIED BY newpassword; |
DROP USER |
删除一个用户。CASCADE 会同时删除用户拥有的所有对象。 |
DROP USER myuser CASCADE; |
其他常用命令
| 命令 |
描述 |
示例 |
REM[ARK] |
在脚本中添加注释。 |
REM This is a comment |
PROMPT |
在屏幕上显示一条消息。 |
PROMPT Connecting to the database... |
EXECUTE / EXEC |
执行一个 PL/SQL 语句或过程。 |
EXEC DBMS_OUTPUT.PUT_LINE('Hello, World!'); |
SHOW |
显示 SQL*Plus 的环境变量设置。 |
SHOW USER (显示当前用户) SHOW ERRORS (显示最近的错误) |
常用函数
| 类别 |
函数 |
描述 |
示例 |
| 字符函数 |
CONCAT(s1, s2) |
连接字符串 |
CONCAT('Hello', ' World') -> 'Hello World' |
|
SUBSTR(string, start, length) |
截取子串 |
SUBSTR('Oracle', 1, 3) -> 'Ora' |
|
LENGTH(string) |
返回字符串长度 |
LENGTH('Oracle') -> 6 |
|
INSTR(string, substr) |
查找子串位置 |
INSTR('Oracle', 'a') -> 3 |
|
TRIM(s) / LTRIM(s) / RTRIM(s) |
去除字符串两边的空格 |
TRIM(' Oracle ') -> 'Oracle' |
| 数值函数 |
ROUND(number, [decimals]) |
四舍五入 |
ROUND(123.456, 2) -> 123.46 |
|
TRUNC(number, [decimals]) |
截断 |
TRUNC(123.456, 2) -> 123.45 |
|
MOD(number, divisor) |
取模 |
MOD(10, 3) -> 1 |
| 日期函数 |
SYSDATE |
返回当前系统日期和时间 |
SELECT SYSDATE FROM dual; |
|
ADD_MONTHS(date, months) |
增加月份 |
ADD_MONTHS(SYSDATE, 3) |
|
MONTHS_BETWEEN(date1, date2) |
计算两个日期之间的月份数 |
MONTHS_BETWEEN(date1, date2) |
|
TRUNC(date, [fmt]) |
截断日期到指定格式 |
TRUNC(SYSDATE, 'MM') -> 返回当月第一天 |
| 转换函数 |
TO_CHAR(date, 'format') |
将日期/数字转换为字符串 |
TO_CHAR(SYSDATE, 'YYYY-MM-DD') |
|
TO_DATE(string, 'format') |
将字符串转换为日期 |
TO_DATE('2025-10-27', 'YYYY-MM-DD') |
|
TO_NUMBER(string) |
将字符串转换为数字 |
TO_NUMBER('123.45') |
| 聚合函数 |
COUNT(*) |
计算行数 |
SELECT COUNT(*) FROM emp; |
|
SUM(column) |
计算总和 |
SELECT SUM(sal) FROM emp; |
|
AVG(column) |
计算平均值 |
SELECT AVG(sal) FROM emp; |
|
MAX(column) / MIN(column) |
计算最大/最小值 |
SELECT MAX(sal) FROM emp; |
重要提示
- 分号 :在 SQL*Plus 中,每个 SQL 语句或 PL/SQL 块都必须以分号
- 大小写:SQL 语句本身不区分大小写(
SELECT 和 select 效果相同),但表名、列名的大小写敏感性取决于数据库的设置,字符串常量是区分大小写的。
DUAL 表:这是一个 Oracle 中的虚拟表,只有一行一列,主要用于计算表达式或获取系统信息,如 SELECT SYSDATE FROM DUAL;。
- 权限:执行某些命令(如
CREATE, DROP, GRANT)需要相应的数据库权限。
希望这份清单能帮助您快速上手和回顾 Oracle 的基本命令!