对于刚接触Oracle数据库的新手来说,最重要的事情是先理解SQL在Oracle体系里到底扮演什么角色。Oracle作为关系型数据库管理系统,所有数据的存取都依赖SQL这一标准化语言。SQL本身不等于某个编程语言,它更偏向声明式:你告诉数据库想要什么结果,优化器决定怎么拿。在Oracle中,SQL语句大致可归为DDL、DML和DCL,零基础学习时不必一口气全吞,先把单表查询和简单增删改做熟,就能解决大部分日常取数问题。

一、SELECT基础查询与WHERE条件过滤
SELECT是Oracle SQL里使用频率最高的语句,它的核心作用是投影与筛选。投影指选择哪些列,筛选指限定哪些行。最简单的写法是从单张表取出全部列,例如从scott用户下的emp表看所有员工信息。但在真实工作中,列出具体列名才是好习惯,这样既减少网络传输,也避免表结构变更带来的意外。
WHERE子句决定了结果集的行范围。Oracle支持等于、不等于、范围、模糊匹配等运算符。需要特别注意的是,字符型和日期型常量必须用单引号包裹,且日期默认格式受NLS_DATE_FORMAT参数影响。如果写成字符串比较日期,可能触发隐式转换导致索引失效。下面示例展示如何查询部门编号30且工资高于1000的员工姓名与岗位。
SELECT ename, job, sal FROM emp WHERE deptno = 30 AND sal > 1000;
除了基础比较,LIKE配合通配符也很常用。下划线代表单个字符,百分号代表任意长度字符串。例如在ename like 'S%'时可找出所有姓S开头的员工。但要注意LIKE以百分号开头时,Oracle通常无法使用该列上的B-tree索引,数据量大时查询会变慢,这是新手容易忽略的性能点。
二、INSERT、UPDATE与DELETE的数据变更操作
仅仅查询还不够,实际业务往往要落地数据。INSERT负责新增行,可以显式列出列名并对应值,也可以依赖表定义顺序省略列名。显式列名更安全,因为当表增加字段且有默认值时,省略写法可能报错。以下示例向emp表插入一条测试记录,指定了员工号、姓名、岗位与部门号。
INSERT INTO emp (empno, ename, job, deptno) VALUES (9999, 'TESTER', 'CLERK', 10);
UPDATE用于修改已有数据,必须搭配WHERE否则会更新全表,这在生产环境是严重事故。比如把部门10的员工工资统一上调百分之五,应明确限定deptno。Oracle执行更新后,变更只存在于当前事务,只有执行COMMIT才会真正持久化,这也是和某些自动提交数据库不同的地方。
UPDATE emp SET sal = sal * 1.05 WHERE deptno = 10; COMMIT;
DELETE语句删除行同样依赖WHERE。若忘写条件,整张表数据被清空但表结构保留,事后只能依赖备份或闪回技术补救。相对DELETE,TRUNCATE属于DDL,速度更快但不可回滚。新手练习时建议在独立测试用户下操作,充分理解事务边界后再碰真实业务表。
三、CREATE TABLE建表与约束保障数据质量
当现成表无法满足需求,就要用CREATE TABLE定义自己的结构。Oracle建表时可同时声明约束,例如主键保证唯一、NOT NULL禁止空值、外键关联父表。良好的约束设计能在数据库层拦住脏数据,比后期写程序校验更可靠。下面创建一个简单的部门小表,设定部门编号为主键且名称非空。
CREATE TABLE dept_small ( deptno NUMBER(2) PRIMARY KEY, dname VARCHAR2(14) NOT NULL, loc VARCHAR2(13) );
除了列级约束,也可以在表级单独定义外键。比如让员工表的deptno引用上面小表,这样插入不存在的部门会被拒绝。很多初学者混淆VARCHAR2与CHAR,CHAR会补空格定长,而VARCHAR2按实际长度存,Oracle里字符类型优先选VARCHAR2。理解这些差异,才能写出既规范又高效的建表语句,为后续复杂查询打下底座。
学习Oracle SQL从零起步,不必追求一天学完所有高级分析函数。先把本文提到的SELECT、DML和建表约束练到不看笔记也能写对,再逐步扩展至多表连接、分组聚合与子查询,路径会顺畅很多。配合本地虚拟机或免费版Oracle Express,多敲多错多观察执行计划,零基础也能在几周内具备基础开发能力。