知识库✳

教程与手册

全部教程
  1. 01Oracle 函数手册
  2. 02性能优化手册
  3. 03Linux Shell
  4. 04Oracle 学习与演练
  5. 05网络基础学习
  6. 06数据治理与管理
返回个人网站
甲Oracle 学习教程从 SQL 到 PL/SQL 与运维
首页课程目录搜索演练场
知识库

已完成 0 / 22 章

模块一 · 入门与准备

  • 01Oracle 数据库体系结构
  • 02环境安装与连接方式
  • 03SQL*Plus 与常用工具

模块二 · SQL 查询基础

  • 04SELECT 查询基础
  • 05过滤与排序
  • 06单行函数
  • 07多表连接
  • 08分组聚合与 HAVING
  • 09子查询

模块三 · 数据与对象

  • 10DML 与事务控制
  • 11表与数据类型
  • 12约束
  • 13索引与执行计划
  • 14视图、序列与同义词

模块四 · PL/SQL 编程

  • 15PL/SQL 块与变量
  • 16流程控制与游标
  • 17存储过程与函数
  • 18触发器
  • 19异常处理

模块五 · 运维与进阶

  • 20用户与权限管理
  • 21表空间与存储管理
  • 22备份与恢复
❖

Oracle 学习教程

返回个人网站知识库

示例代码基于 Oracle AI Database 26ai / 23ai,查询示例使用官方 HR 示例方案。

以 Next.js 16 · Tailwind CSS v4 · HeroUI v3 装帧

05
  1. 首页
  2. 课程目录
  3. 过滤与排序

第 5 章◆入门◆建议 35 分钟◆模块二 · SQL 查询基础

过滤与排序

用 WHERE 精确筛选,用 ORDER BY 控制顺序,理清 AND/OR 优先级与模糊匹配的写法。

学完这一章,你应该能

  • 熟练使用 BETWEEN / IN / LIKE / IS NULL
  • 理解 AND/OR 优先级并用括号规避错误
  • 会按多列排序并控制 NULL 位置

5.1基本比较与范围

  • BETWEEN a AND b 等价于 >= a AND <= b,包含两个边界
  • IN 列表里可以有 NULL,但 NULL 永远不会匹配成功
  • LIKE 中 % 匹配任意多个字符,_ 匹配恰好一个字符
  • 字符串比较区分大小写,除非用 UPPER/LOWER 或设置排序规则
常见筛选条件
SELECT employee_id, last_name, salary, hire_date
FROM   employees
WHERE  salary BETWEEN 5000 AND 10000          -- 含边界
  AND  hire_date >= DATE '2005-01-01'
  AND  department_id IN (50, 60, 80)
  AND  job_id LIKE 'SA\_%' ESCAPE '\'        -- 下划线是通配符,需转义
ORDER  BY salary DESC;
在你的专用沙箱里执行打开演练场

5.2AND / OR 优先级

NOT 优先级最高,其次 AND,最后 OR。这意味着不加括号时,A OR B AND C 会被理解成 A OR (B AND C),往往不是你想要的。规则很简单:只要混用 AND 和 OR,就加括号。

优先级陷阱对比
-- 未加括号:实际是 dept=50 OR (dept=60 AND salary>10000)
SELECT employee_id, department_id, salary
FROM   employees
WHERE  department_id = 50 OR department_id = 60 AND salary > 10000;

-- 加上括号,语义才清晰
SELECT employee_id, department_id, salary
FROM   employees
WHERE  (department_id = 50 OR department_id = 60) AND salary > 10000
ORDER  BY department_id, salary DESC;
在你的专用沙箱里执行打开演练场

5.3排序细节

多列排序与 NULL 位置
SELECT employee_id, department_id, commission_pct
FROM   employees
WHERE  department_id IN (80, 90)
ORDER  BY department_id ASC,
          commission_pct DESC NULLS LAST;
          -- 把空值放最后
在你的专用沙箱里执行打开演练场
按别名或列序号排序
-- 按 SELECT 中的别名排序(ORDER BY 在 SELECT 之后执行,允许)
SELECT last_name, salary * 12 AS annual_salary
FROM   employees
ORDER  BY annual_salary DESC;

-- 也可以用列序号,但不推荐:改 SELECT 时容易出错
SELECT last_name, salary FROM employees ORDER BY 2 DESC;
在你的专用沙箱里执行打开演练场

提示 ORDER BY 是唯一允许引用 SELECT 别名的地方。如果排序结果不符合预期,先确认没有把 NULL 当成 0 来理解。

练习

3 题 · 先自己写,再展开对照

参考答案

实际等价于:
department_id = 50 OR (department_id = 60 AND salary > 10000)

因为优先级是 NOT > AND > OR,AND 先结合。
只要 AND 和 OR 混用就加括号,这是避免此类 bug 最省事的习惯。

自评要点

  • AND 优先级高于 OR
  • 结论是加了括号才对

参考答案

SELECT employee_id, last_name
FROM   employees
WHERE  last_name LIKE 'Sm%'
ORDER  BY last_name;
在你的专用沙箱里执行打开演练场

自评要点

  • 下划线匹配恰好一个字符、百分号匹配任意多个
  • 知道前导通配符 LIKE '%m%' 无法用索引

参考答案

SELECT employee_id, commission_pct
FROM   employees
ORDER  BY commission_pct ASC NULLS LAST;
在你的专用沙箱里执行打开演练场

自评要点

  • 知道 NULLS LAST / NULLS FIRST
  • 知道 Oracle 视 NULL 为最大,所以升序默认排最后、降序默认排最前
← 上一章

SELECT 查询基础

下一章 →

单行函数