Oracle 数据库简单查询从基础语法到实战案例
作者:摸鱼星
在 Oracle 数据库日常操作中,查询是最基础也最核心的技能。本文将基于employees(员工表)和departments(部门表),从语法规则、基础查询、条件查询、排序到函数应用,系统梳理 Oracle 简单查询的全流程,每个知识点都搭配实战案例,适合新手入门学习,也可作为日常开发的参考手册。
一、查询基础:语法结构与核心规则
在开始查询之前,必须先掌握 Oracle 查询的基础语法和注意事项,避免因格式问题导致报错。
1. 核心语法结构
Oracle 查询的最基本结构由SELECT(指定查询列)和FROM(指定数据来源表)组成,语法如下
SELECT 列名1, 列名2, 列名3, … -- 要查询的列,多列用逗号分隔 FROM 表名; -- 数据所在的表,结尾加分号表示语句结束
2. 关键注意事项
这 3 条规则是避免语法错误的 “避坑指南”,务必牢记:
- 大小写不敏感:SQL 关键字(如
SELECT、FROM)、表名(如employees)、字段名(如salary)均不区分大小写,select first_name from employees与SELECT FIRST_NAME FROM EMPLOYEES效果一致。 - 标点符号为英文:所有标点(逗号、分号、引号等)必须使用英文符号,例如查询姓名时用
'King'(英文单引号),而非中文‘King’。 - 分号的作用:单条查询语句结尾可加分号;多条语句同时执行时,每条语句必须以分号分隔,执行前需选中所有要运行的 SQL 脚本。
二、基础查询:从部分列到特殊处理
基础查询涵盖 “查哪些列”“如何处理列数据”“如何简化列名” 等场景,是后续复杂查询的基础。
1. 查询指定部分列
当不需要表中所有数据,仅需特定列时,直接在SELECT后指定列名即可。
需求:查询所有员工的 “姓名(名 + 姓)” 和 “薪资”
-- first_name:员工名,last_name:员工姓,salary:薪资 SELECT first_name, last_name, salary FROM employees;
2. 查询所有列
若需获取表中所有字段数据,无需逐个列出列名,用通配符*代替即可(注意:生产环境中尽量避免用*,优先指定列名,减少不必要的数据传输)。
需求:查询employees表中所有员工的完整信息
SELECT * FROM employees;
3. 对列进行数学运算
仅支持对数字类型列(如薪资salary、员工编号employee_id)进行数学运算,常见运算包括加减乘除,不支持%取余(需用后续的mod函数),\在 Oracle 中有特殊含义,也不可用。
需求:计算员工薪资 “加 100”“减 100”“乘 100”“除 100” 后的结果
SELECT salary + 100 AS 薪资加100, salary - 100 AS 薪资减100, salary * 100 AS 薪资乘100, salary / 100 AS 薪资除100 FROM employees;
4. 给列 / 表取别名
查询结果中,默认显示原始列名(如salary*12),可读性差;表名过长时,也可简化。通过 “别名” 可解决这一问题,规则如下:
- 列别名:用
AS关键字(可省略),格式为列表达式 AS 别名,别名含中文或特殊字符时需用双引号括起。 - 表别名:必须省略
AS,直接用表名 别名,常用于多表关联查询。
需求 1:计算员工年薪,并将列名显示为 “年薪”
-- AS可省略,两种写法均有效 SELECT salary * 12 AS 年薪 FROM employees; SELECT salary * 12 年薪 FROM employees; -- 省略AS
需求 2:给employees表取别名e,查询员工名和薪资
-- 表别名不可加AS,正确写法如下 SELECT e.first_name, e.salary FROM employees e;
5. 字符串拼接
Oracle 中用||实现字符串拼接,相当于 Java 中的+,拼接的 “字符 / 字符串” 需用英文单引号括起(Oracle 不区分字符和字符串)。
需求:将员工的 “名” 和 “姓” 拼接为 “姓名”(格式:名 - 姓)
SELECT first_name || '-' || last_name AS 姓名 FROM employees;
6. 数据去重(DISTINCT)
当查询结果存在重复数据时,用DISTINCT去除重复行,规则如下:
DISTINCT后仅跟 1 个字段:去除该字段的重复值。DISTINCT后跟多个字段:仅当所有字段的值均相同时,才视为重复行并去除。
需求 1:查询所有员工的 “领导编号”,去除重复编号
sql
需求 2:查询 “部门编号 + 领导编号” 的唯一组合(即同一部门的同一领导仅显示一次)
SELECT DISTINCT department_id, manager_id FROM employees;
7. 条件判断(CASE WHEN)
CASE WHEN相当于 Java 中的if-else,用于对表中已有列的数据进行判断,生成新的列(如根据薪资分级)。
语法格式:
CASE WHEN 条件1 THEN 结果1 -- 满足条件1时,显示结果1 WHEN 条件2 THEN 结果2 -- 满足条件2时,显示结果2 ... ELSE 其他结果 -- 所有条件都不满足时,显示其他结果 END AS 新列名
需求:根据员工薪资分级,生成 “薪资水平” 列(高薪:≥10000,一般:≥8000,垃圾:<8000)
SELECT
salary,
CASE
WHEN salary >= 10000 THEN '高薪'
WHEN salary >= 8000 THEN '一般'
ELSE '垃圾'
END AS 薪资水平
FROM employees;8. 查询当前时间(SYSDATE + DUAL 表)
Oracle 中用SYSDATE获取当前系统时间(包含日期和时分秒),但SYSDATE需结合 “哑表DUAL” 使用 ——DUAL是 Oracle 内置的一行一列的临时表,仅用于无实际表关联的查询(如查询常量、函数结果)。
需求:查询当前系统时间
SELECT SYSDATE AS 当前时间 FROM dual;
三、条件查询(WHERE):精准筛选数据
基础查询是 “获取所有数据”,而条件查询用WHERE子句筛选 “符合条件的数据”,是日常查询中最常用的功能。语法结构如下:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 筛选条件; -- 筛选条件需满足“布尔值”(true/false)
1. 比较查询(>、>=、<、<=、!=、=)
通过比较运算符筛选数据,包括 “等值查询” 和 “不等值查询”。
(1)等值查询(=)
筛选 “字段值等于指定值” 的数据,注意字符串需用英文单引号括起。
需求:查询 “员工名(first_name)为 King” 的所有信息
SELECT * FROM employees WHERE first_name = 'King'; -- 字符串'King'用英文单引号
(2)不等值查询(>、>=、<、<=、!=、<>)
筛选 “字段值不等于 / 大于 / 小于指定值” 的数据,!=和<>均表示 “不等于”,效果一致。
需求:查询 “薪资(salary)大于 8000” 的员工姓名和薪资
SELECT first_name, last_name, salary FROM employees WHERE salary > 8000;
2. 空值查询(IS NULL / IS NOT NULL)
Oracle 中不能用=判断空值,必须用IS NULL(查询空值)或IS NOT NULL(查询非空值)。
需求 1:查询 “部门编号(department_id)为空” 的员工信息
-- 错误写法:WHERE department_id = null SELECT * FROM employees WHERE department_id IS NULL; -- 正确写法
需求 2:查询 “部门编号(department_id)非空” 的员工信息
SELECT * FROM employees WHERE department_id IS NOT NULL;
3. 多条件查询(AND / OR)
当筛选条件有多个时,用AND或OR连接:
AND:相当于 Java 中的&&,所有条件必须同时满足。OR:相当于 Java 中的||,满足任意一个条件即可。
需求 1:查询 “员工编号(employee_id)≤150 且 薪资≥10000” 的员工信息
SELECT * FROM employees WHERE employee_id <= 150 AND salary >= 10000;
需求 2:查询 “员工编号≤150 或 薪资≥8000” 的员工信息
SELECT * FROM employees WHERE employee_id <= 150 OR salary >= 8000;
4. 区间查询(BETWEEN AND / NOT BETWEEN AND)
筛选 “字段值在指定区间内” 的数据,BETWEEN 最小值 AND 最大值包含区间的边界值,等价于>= 最小值 AND <= 最大值;NOT BETWEEN AND则相反。
需求 1:查询 “员工编号在 110~150 之间(包含 110 和 150)” 的员工信息
-- 等价写法1:WHERE employee_id >= 110 AND employee_id <= 150 SELECT * FROM employees WHERE employee_id BETWEEN 110 AND 150; -- 更简洁
需求 2:查询 “员工编号不在 110~150 之间” 的员工信息
SELECT * FROM employees WHERE employee_id NOT BETWEEN 110 AND 150;
5. 枚举查询(IN / NOT IN)
筛选 “字段值在指定枚举列表中” 的数据,IN (值1, 值2, ...)等价于= 值1 OR = 值2 OR ...;NOT IN则相反,适用于枚举值较少的场景。
需求 1:查询 “部门编号为 60、90、100” 的员工信息
-- 等价写法:WHERE department_id = 60 OR department_id = 90 OR department_id = 100 SELECT * FROM employees WHERE department_id IN (60, 90, 100); -- 更简洁
需求 2:查询 “部门编号不是 60、90、100” 的员工信息
SELECT * FROM employees WHERE department_id NOT IN (60, 90, 100);
6. 模糊查询(LIKE)【重点】
通过通配符匹配 “字符串格式” 的数据,语法为LIKE '匹配模式',核心是掌握两个通配符:
%:匹配任意多个字符(包括 0 个字符)。_:匹配恰好 1 个字符(不能多也不能少)。
常见场景案例
| 需求 | SQL 语句 | 说明 |
|---|---|---|
| 查询 “姓(last_name)以 K 开头” 的员工 | SELECT * FROM employees WHERE last_name LIKE 'K%'; | K%表示 “以 K 开头,后面跟任意字符” |
| 查询 “姓中包含 a” 的员工 | SELECT * FROM employees WHERE last_name LIKE '%a%'; | %a%表示 “任意位置包含 a” |
| 查询 “姓以 K 开头且长度为 5” 的员工 | SELECT * FROM employees WHERE last_name LIKE 'K____'; | K后跟 4 个_,共 5 个字符(K+4 个字符) |
四、排序(ORDER BY):规范结果顺序
默认情况下,查询结果的顺序是随机的(与数据存储顺序相关),用ORDER BY可按指定列排序,语法如下:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 筛选条件 ORDER BY 列名1 [ASC/DESC], 列名2 [ASC/DESC]; -- 排序规则
ASC:升序(默认,可省略),如数字从大到小、字符串按字典序(A→Z)。DESC:降序,如数字从大到小、字符串按字典序(Z→A)。- 多列排序:先按第一列排序,若第一列值相同,再按第二列排序,以此类推。
需求 1:查询 “部门编号为 50” 的员工,按 “薪资降序” 排列(薪资高的在前)
SELECT * FROM employees WHERE department_id = 50 ORDER BY salary DESC;
需求 2:查询 “部门编号为 50” 的员工,先按 “薪资降序”,薪资相同的按 “员工名升序”(A→Z)排列
SELECT * FROM employees WHERE department_id = 50 ORDER BY salary DESC, first_name ASC;
五、函数:简化复杂计算与处理
Oracle 函数按作用范围分为 “单行函数” 和 “多行函数(组函数)”,前者处理每一行数据并返回一个结果,后者处理一组数据并返回一个结果。
1. 单行函数
(1)取余函数(MOD (m, n))
计算m除以n的余数,等价于 Java 中的m % n,支持数字列或常量
需求 1:计算 5 除以 2 的余数
SELECT MOD(5, 2) AS 余数 FROM dual; -- 结果为1
需求 2:计算每个员工薪资除以 3 的余数
SELECT salary, MOD(salary, 3) AS 薪资取余3 FROM employees;
(2)字符串长度函数(LENGTH (字符串))
计算字符串的长度(字符数),支持字符串常量或字符类型列(如first_name、last_name)。
需求 1:计算字符串 “adbcedf” 的长度
SELECT LENGTH('adbcedf') AS 字符串长度
FROM dual; -- 结果为7需求 2:查询 “姓(last_name)长度为 5” 的员工信息
SELECT * FROM employees WHERE LENGTH(last_name) = 5;
(3)日期转换函数(TO_DATE / TO_CHAR)
Oracle 中日期有特定格式,TO_DATE用于将 “字符串” 转为 “日期类型”,TO_CHAR用于将 “日期类型” 转为 “指定格式的字符串”,核心是掌握日期格式符(常用格式符如下):
| 格式符 | 含义 | 示例 |
|---|---|---|
yyyy | 4 位年份 | 2024 |
mm | 2 位月份 | 05(5 月) |
dd | 2 位日期 | 10 |
hh | 24 小时制小时 | 14(下午 2 点) |
mi | 分钟 | 30 |
ss | 秒 | 45 |
day | 星期几 | 星期五 |
需求 1:将字符串 “1992-12-23 8:50:55” 转为日期类型
sql
需求 2:将当前时间(SYSDATE)转为 “2024-05-10 14:30:45 星期五” 格式
SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd hh:mi:ss day') AS 格式化时间 FROM dual;
2. 多行函数(组函数)
组函数默认将表中所有行视为 “一组数据”,返回一个汇总结果,常见函数如下:
| 函数 | 作用 | 说明 |
|---|---|---|
MAX(列) | 求最大值 | 忽略空值,适用于数字、日期、字符串(按字典序) |
MIN(列) | 求最小值 | 同上 |
AVG(列) | 求平均值 | 仅适用于数字列,忽略空值 |
SUM(列) | 求总和 | 仅适用于数字列,忽略空值 |
COUNT(列) | 求非空行数 | 统计该列 “有值” 的行数,空值不计数;COUNT(*)统计所有行数(包括空值) |
需求 1:统计employees表的 “员工总数”“最高薪资”“最低薪资”“平均薪资”
SELECT COUNT(*) AS 员工总数, -- 统计所有行数(包括空值) MAX(salary) AS 最高薪资, -- 最高薪资 MIN(salary) AS 最低薪资, -- 最低薪资 AVG(salary) AS 平均薪资 -- 平均薪资(自动忽略空值) FROM employees;
需求 2:统计 “部门编号(department_id)非空” 的员工数量
SELECT COUNT(department_id) AS 部门非空员工数 FROM employees; -- 空的department_id不计数
六、总结与拓展
本文覆盖了 Oracle 简单查询的核心知识点,从基础语法到实战案例,可满足日常开发中 80% 以上的简单查询需求。后续可进一步学习 “多表关联查询”“分组查询(GROUP BY)”“子查询” 等进阶内容,逐步构建完整的 Oracle 查询体系。
到此这篇关于Oracle 数据库简单查询从基础语法到实战案例的文章就介绍到这了,更多相关oracle 数据库查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
