当前位置: 首页 > article >正文

【Oracle11g SQL详解】ORDER BY 子句的排序规则与应用

ORDER BY 子句的排序规则与应用

在 Oracle 11g 中,ORDER BY 子句用于对查询结果进行排序。通过使用 ORDER BY,可以使返回的数据按照指定的列或表达式以升序或降序排列,便于数据的分析和呈现。本文将详细讲解 ORDER BY 子句的规则及其常见应用。


一、ORDER BY 子句的基本语法
SELECT 列名1, 列名2, ...
FROM 表名
[WHERE 条件]
ORDER BY 列名 [ASC|DESC], 列名2 [ASC|DESC];

说明:

  • ORDER BY:指定排序列或表达式。
  • ASC(默认):升序排列,从小到大。
  • DESC:降序排列,从大到小。
  • 可以根据多个列进行排序,按列顺序依次排序。

二、ORDER BY 子句的排序规则
  1. 按单列排序
    • 默认情况下,ORDER BY 按升序排列。
    • 如果需要降序排列,必须显式指定 DESC

示例:

SELECT employee_id, salary 
FROM employees
ORDER BY salary ASC;  -- 按薪资升序排列
SELECT employee_id, salary 
FROM employees
ORDER BY salary DESC; -- 按薪资降序排列

  1. 按多列排序
    • 先按第一列排序,如果第一列值相同,则按第二列排序,以此类推。

示例:

SELECT employee_id, department_id, salary 
FROM employees
ORDER BY department_id ASC, salary DESC;

说明:

  • department_id 升序排列。
  • department_id 相同的情况下,按 salary 降序排列。

  1. 按表达式排序
    • ORDER BY 支持基于表达式的排序,如计算列或函数结果。

示例:

SELECT employee_id, first_name, last_name, salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC;

说明: 按员工年薪(salary * 12)从高到低排序。


  1. 按列别名排序
    • 可以使用 SELECT 中定义的列别名进行排序。

示例:

SELECT employee_id, first_name || ' ' || last_name AS full_name, salary 
FROM employees
ORDER BY full_name ASC;

说明: 按员工全名(full_name)字母顺序升序排列。


  1. 按列位置排序
    • 直接使用列的位置编号排序,从 SELECT 子句中列的顺序开始。

示例:

SELECT employee_id, department_id, salary 
FROM employees
ORDER BY 2 ASC, 3 DESC;

说明:

  • 2 表示按 department_id 升序排列。
  • 3 表示按 salary 降序排列。

三、ORDER BY 与 NULL 值的排序

在 Oracle 中,NULL 值在排序时具有以下特点:

  • 默认情况下,升序排列时,NULL 值排在最后;
  • 降序排列时,NULL 值排在最前。

如果需要修改这一行为,可以使用 NULLS FIRSTNULLS LAST 明确指定。

示例:

SELECT employee_id, salary 
FROM employees
ORDER BY salary ASC NULLS FIRST; -- NULL 值排在最前
SELECT employee_id, salary 
FROM employees
ORDER BY salary DESC NULLS LAST; -- NULL 值排在最后

四、ORDER BY 子句的高级用法
  1. 按日期排序
SELECT employee_id, hire_date 
FROM employees
ORDER BY hire_date DESC;

说明: 按雇佣日期从最近到最早排序。

  1. 按条件排序
SELECT employee_id, salary, 
       CASE 
           WHEN salary >= 10000 THEN '高薪' 
           WHEN salary >= 5000 THEN '中等薪资' 
           ELSE '低薪' 
       END AS salary_level
FROM employees
ORDER BY salary_level ASC, salary DESC;

说明:

  • 先按自定义薪资级别排序(高薪 > 中等薪资 > 低薪)。
  • 在相同薪资级别内,再按实际薪资降序排列。
  1. 限制查询结果的排序行数
    结合 ROWNUMFETCH 子句,按排序结果筛选出前 N 条记录。

示例:返回薪资最高的前 5 名员工:

SELECT employee_id, salary 
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS ONLY;

五、性能优化建议
  1. 使用索引

    • 对排序列建立索引,尤其是对大表或排序操作频繁的列。
  2. 避免过多排序列

    • 排序列越多,排序计算量越大,尽量减少不必要的排序列。
  3. 减少复杂表达式

    • 如果排序基于复杂表达式,建议在查询之前先将表达式计算好的结果存储为列。

六、练习示例
  1. 查询所有员工信息,按部门编号升序排列:
SELECT * FROM employees
ORDER BY department_id ASC;
  1. 查询所有员工的姓名和薪资,按薪资降序排列,薪资相同的按姓名升序排列:
SELECT first_name, last_name, salary 
FROM employees
ORDER BY salary DESC, first_name ASC;
  1. 查询所有部门信息,按部门名称的字母倒序排列:
SELECT department_id, department_name 
FROM departments
ORDER BY department_name DESC;

七、小结

ORDER BY 子句是 SQL 查询中重要的工具,用于对数据进行排序以满足各种分析需求。掌握其语法、规则和优化方法,可以显著提升查询的实用性和效率。


http://www.kler.cn/a/417306.html

相关文章:

  • C++ Primer 数组
  • Baklib赋能数字内容体验个性化推荐提升用户体验的未来之路
  • 【Spring Boot】 SpringBoot自动装配-Condition
  • [ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别
  • 【Leetcode 每日一题】47. 全排列 II
  • 2025蓝桥杯JAVA编程题练习Day2
  • pandas数据处理及其数据可视化的全流程
  • 爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)
  • Java设计模式 —— 【创建型模式】原型模式(浅拷贝、深拷贝)详解
  • (附项目源码)PHP开发语言,225 基于PHP的高校二手物品交易系统的设计与实现,计算机毕设程序开发+文案(LW+PPT)
  • 深入理解异步编程:使用 `asyncio` 和 `aiohttp` 进行并发请求
  • 性能测试工具Grafana、InfluxDB和Collectd的搭建
  • Linux - 时间服务器
  • springboot学习-spring-boot-data-jdbc分页/排序/多表查询的例子
  • 基于大数据python 房屋价格数据分析预测可视化系统(源码+LW+部署讲解+数据库+ppt)
  • ESP32-S3模组上跑通ES8388(10)
  • CommonJS 和 ES Modules 的 区别
  • uniapp配置全局消息提醒
  • Spring - RabbitMQ循环依赖问题解决
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-39
  • QT开发准则
  • JS中的类与对象
  • Axios:现代JavaScript HTTP客户端
  • 社交新零售模式下“2+1 链动模式 S2B2C 商城小程序”的创新实践与发展策略
  • flink学习(10)——allowedLateness/测道输出
  • redis快速进门