本文从零基础入门到高阶实战,循序渐进讲解Oracle开发、运维日常用到的核心命令,涵盖基础查询、条件筛选、分组统计、多表关联、DDL结构操作、DML数据操作、事务控制、高阶函数、性能优化等核心内容,所有命令均适配企业实际开发场景,零基础可直接对照学习、复用实操。
一、零基础入门:Oracle基础核心命令
本章节适合完全零基础用户,掌握Oracle最基础的连接、查询、数据筛选语法,是所有操作的核心基石。
1.1 数据库基础连接与查看命令
用于本地/服务器连接数据库、查看基础信息,是操作Oracle的第一步。
— 1. 命令行连接数据库(服务器终端使用)
sqlplus 用户名/密码@IP:端口/数据库实例名
— 2. 查看当前登录用户
SELECT USER FROM DUAL;
— 3. 查看数据库版本
SELECT * FROM V$VERSION;
— 4. 查看当前系统时间(Oracle无直接now(),固定用法)
SELECT SYSDATE FROM DUAL;
— 5. 退出数据库连接
EXIT;
知识点:DUAL是Oracle虚拟表,专门用于查询常量、系统函数、系统参数,无需查询真实业务表。
1.2 基础查询语句(核心SELECT)
SELECT是Oracle最常用的核心命令,用于查询表数据,语法通用且高频使用。
— 查询表所有字段(*代表全部字段)
SELECT * FROM 表名;
— 查询指定字段(企业开发优先用指定字段,禁止滥用*)
SELECT 字段1,字段2,字段3 FROM 表名;
— 字段别名展示(AS可省略,别名支持中文)
SELECT a 编号,b 名称,SYSDATE 当前时间 FROM 表名;
— 去重查询
DISTINCT SELECT DISTINCT a,b,c FROM 表名;
1.3 基础条件筛选 WHERE
用于精准过滤数据,支持比较、模糊、区间、空值判断,日常查询必备。
— 等值查询
SELECT * FROM 表名 WHERE a = '1001';
— 区间查询(大于、小于、区间范围)
SELECT * FROM 表名 WHERE num > 10 AND num < 100;
SELECT * FROM 表名 WHERE num BETWEEN 10 AND 100;
— 模糊查询 %匹配任意字符,_匹配单个字符
SELECT * FROM 表名 WHERE name LIKE '%张三%';
— 空值、非空查询(重点:Oracle空值必须用IS判断,不能用=)
SELECT * FROM 表名 WHERE age IS NULL;
SELECT * FROM 表名 WHERE age IS NOT NULL;
— 枚举查询 IN
SELECT * FROM 表名 WHERE a IN ('01','02','03');
1.4 排序与分页(基础数据整理)
— 排序:ASC升序(默认)、DESC降序
SELECT * FROM 表名 ORDER BY create_time DESC;
— Oracle基础分页(ROWNUM 伪列分页,11g及以下通用),查询11-20条数据
SELECT * FROM ( SELECT 字段1,字段2,ROWNUM rn FROM 表名 WHERE ROWNUM <= 20 ) WHERE rn > 10;
二、进阶实操:日常开发高频核心命令
掌握基础后,本章节聚焦企业开发最常用的分组统计、多表查询、数据增删改、事务控制,覆盖80%日常业务场景。
2.1 分组统计 GROUP BY(重点)
核心规则:SELECT后只能写分组字段、聚合函数,多余字段需通过高阶语法处理(后文深入讲解)。
— 基础分组:按a、b分组,统计数量、总和
SELECT a,b, COUNT(*) 数据总数, SUM(amount) 总金额, MAX(create_time) 最新时间, MIN(score) 最低分数 FROM 业务表 GROUP BY a,b;
— 分组后条件过滤(HAVING,分组后过滤,WHERE分组前过滤), 只展示总金额大于1000的分组
SELECT a,b,SUM(amount) 总金额 FROM 业务表 GROUP BY a,b HAVING SUM(amount) > 1000;
2.2 多表关联查询(双表/多表)
Oracle四大关联方式:内连接、左连接、右连接、全连接,开发最常用左连接。
— 1. 内连接 INNER JOIN:只查询两张表匹配的数据
SELECT t1.*,t2.name FROM 表1 t1 INNER JOIN 表2 t2 ON t1.a = t2.a;
— 2. 左连接 LEFT JOIN:左表数据全部保留,右表匹配不到显示空(开发首选)
SELECT t1.a,t1.b,t2.d,t2.f FROM 表1 t1 LEFT JOIN 表2 t2 ON t1.a = t2.a AND t1.b = t2.b;
— 3. 右连接 RIGHT JOIN、全连接 FULL JOIN
SELECT * FROM 表1 t1 RIGHT JOIN 表2 t2 ON t1.a = t2.a;
SELECT * FROM 表1 t1 FULL JOIN 表2 t2 ON t1.a = t2.a;
2.3 数据增删改 DML命令
所有修改数据的操作,必须搭配事务控制,避免数据异常。
— 1. 新增数据
INSERT INTO 表名(字段1,字段2,字段3) VALUES ('值1','值2',SYSDATE);
— 2. 批量新增(查询结果插入新表)
INSERT INTO 新表(字段1,字段2) SELECT 字段1,字段2 FROM 旧表;
— 3. 修改数据(务必加WHERE条件,否则全表更新)
UPDATE 表名 SET 字段1='新值',字段2=100 WHERE a='1001';
— 4. 删除数据
DELETE FROM 表名 WHERE a='1001'; — 条件删除
TRUNCATE TABLE 表名; — 清空全表,不可回滚、速度极快
2.4 事务控制命令(重中之重)
Oracle默认事务未自动提交,增删改必须手动提交,否则数据不生效。
COMMIT; — 提交事务,数据永久生效
ROLLBACK; — 回滚事务,撤销所有未提交的增删改操作
开发规范:测试环境先执行SQL,确认无误后COMMIT;操作失误立即ROLLBACK回滚。
2.5 表结构操作 DDL命令
— 1. 查询表结构
DESC 表名;
— 2. 新增字段
ALTER TABLE 表名 ADD 新字段 VARCHAR2(50);
— 3. 修改字段类型/长度
ALTER TABLE 表名 MODIFY 字段 NUMBER(10);
— 4. 删除字段
ALTER TABLE 表名 DROP COLUMN 字段名;
— 5. 重命名表
RENAME 旧表名 TO 新表名;
— 6. 创建索引(优化查询速度)
CREATE INDEX 索引名 ON 表名(字段1,字段2);
三、深入进阶:企业高阶实战命令
针对开发中复杂场景:分组取最新数据、多表合并去重、字段拼接、数据判重、窗口函数高阶用法,解决日常疑难问题。
3.1 分组取最新一条数据(高频业务场景)
解决需求:按a、b、c分组,每组保留最新一条数据,带出d、f、g、h多余字段(解决分组多余字段报错问题)。
— 单表分组取最新(通用最优写法)
SELECT a,b,c,d,f,g,h FROM ( SELECT a,b,c,d,f,g,h, ROW_NUMBER() OVER(PARTITION BY a,b,c ORDER BY create_time DESC) rn FROM 业务表 ) t WHERE rn = 1;
3.2 两张表合并分组取最新数据
合并两张结构相同的表数据,统一分组、取每组最新记录,企业报表、数据汇总高频使用。 合并两张表所有数据,UNION ALL性能远优于UNION
SELECT a,b,c,d,f,g,h FROM ( SELECT a,b,c,d,f,g,h, ROW_NUMBER() OVER(PARTITION BY a,b,c ORDER BY create_time DESC) rn FROM (
SELECT a,b,c,d,f,g,h,create_time FROM 表1 UNION ALL SELECT a,b,c,d,f,g,h,create_time FROM 表2 ) all_data ) t WHERE rn = 1;
3.3 分组多余字段终极解决方案
解决ORA-00979:不是GROUP BY表达式报错,两种高阶写法:
— 写法1:KEEP函数(Oracle独有,单层查询,性能高)
SELECT a,b,c, MAX(d) KEEP(DENSE_RANK LAST ORDER BY create_time) d, MAX(f) KEEP(DENSE_RANK LAST ORDER BY create_time) f FROM 业务表 GROUP BY a,b,c;
— 写法2:LISTAGG 分组字段拼接(多值合并为字符串)
SELECT a,b,c, LISTAGG(d,',') WITHIN GROUP(ORDER BY create_time) d拼接内容 FROM 业务表 GROUP BY a,b,c;
3.4 常用高阶函数
— 1. 空值替换 NVL(核心常用)
SELECT NVL(字段,0) 字段 FROM 表名; — 空值转为0
— 2. 条件判断 CASE WHEN
SELECT 字段, CASE WHEN score >=90 THEN '优秀' WHEN score >=60 THEN '及格' ELSE '不及格' END 等级 FROM 表名;
— 3. 时间格式化
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') 当前时间 FROM DUAL;
— 4. 字符串转日期
SELECT TO_DATE('2026-06-14','YYYY-MM-DD') 转换日期 FROM DUAL;
四、性能优化与运维常用命令
深入开发必备,解决查询卡顿、慢SQL排查、索引优化、数据统计问题。
4.1 慢SQL排查
— 查看执行计划(分析SQL性能瓶颈,必备优化命令) EXPLAIN PLAN FOR 你的SQL语句; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
4.2 索引运维命令
— 查看表所有索引
SELECT * FROM USER_INDEXES WHERE TABLE_NAME='表名';
— 删除索引
DROP INDEX 索引名;
4.3 数据统计与排查
— 统计表数据量
SELECT COUNT(*) FROM 表名;
— 查询重复数据(按a,b,c判重)
SELECT a,b,c,COUNT(*) 重复次数 FROM 表名 GROUP BY a,b,c HAVING COUNT(*) > 1;
五、高频报错避坑总结
-
ORA-00979:GROUP BY 表达式错误,SELECT字段必须是分组字段或聚合函数,用窗口函数/KEEP函数解决
-
ORA-01489:LISTAGG拼接超长,改用XMLAGG函数
-
空值查询无效:禁止使用=NULL,必须用IS NULL/IS NOT NULL
-
全表更新/删除:增删改务必加WHERE条件,操作前先SELECT校验数据
-
事务未提交:DML操作后必须执行COMMIT,否则他人无法查询到最新数据
六、学习总结
1. 零基础核心:掌握SELECT查询、WHERE筛选、增删改、事务,满足基础数据查询和维护;
2. 进阶核心:精通GROUP BY分组、多表JOIN关联、事务控制、常用函数,覆盖日常80%业务开发;
3. 深入核心:掌握窗口函数分组取最新、多表合并查询、SQL性能优化,解决复杂业务场景和性能问题;
4. 开发规范:优先使用指定字段查询、左连接、事务手动提交,拒绝全表操作、滥用*、不规范分组。

