引言
排序算法是计算机科学中最基础且应用最广泛的算法之一,几乎渗透在编程开发的各个领域。从简单的学生成绩排名到复杂的数据库查询优化,排序的身影无处不在。
具体来说,排序算法的高频使用主要体现在以下几个方面:
- 数据处理与分析
- 在数据分析中,经常需要对海量数据进行排序以便快速查找
- 例如电商平台需要将商品按价格、销量等维度排序展示
- 系统性能优化
- 数据库索引通常使用B树等排序结构来提高查询效率
- 操作系统中的任务调度也依赖于优先级排序
- 基础算法实现
- 许多算法如二分查找、归并排序都依赖于有序数据集
- 图形学中的Z-buffer算法需要对多边形进行深度排序
- 日常应用场景
- 手机通讯录按字母顺序排序
- 音乐播放列表按添加时间或播放次数排序
- 社交媒体信息流按时间倒序排列
- 算法面试考察
- 排序算法是技术面试中的必考知识点
- 常见考察点包括时间复杂度分析和优化思路
在实际开发中,不同的排序算法各有优劣:
- 快速排序在平均情况下性能最优
- 归并排序适合大数据量的外部排序
- 计数排序在特定范围内具有线性时间复杂度
因此,深入理解各种排序算法的原理和适用场景,是每个程序员必备的基本功。
ORDER BY
是 SQL 查询语句中用于对结果集进行排序的子句。它可以根据一个或多个列对查询结果进行升序(ASC)或降序(DESC)排列,是数据处理和分析中非常常用的功能。
基本语法
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
详细功能说明
-
单列排序
-- 按员工姓名升序排列 SELECT * FROM employees ORDER BY last_name ASC; -- 按工资降序排列 SELECT * FROM employees ORDER BY salary DESC;
-
多列排序
-- 先按部门升序,再按工资降序 SELECT * FROM employees ORDER BY department_id ASC, salary DESC;
-
排序规则
- 数值类型:按数值大小排序
- 字符串类型:按字母顺序排序
- 日期类型:按时间先后排序
- NULL 值:默认放在最后(可通过
NULLS FIRST/LAST
调整)
-
性能考虑
- 排序操作会消耗较多资源
- 大数据量排序时建议添加适当的索引
- 可以使用
LIMIT
减少排序数据量
实际应用场景
- 电商网站商品列表按价格排序
- 学生成绩单按分数高低排序
- 新闻网站文章按发布时间排序
- 销售报表按销售额排序
注意事项
ORDER BY
是 SQL 语句中最后执行的子句之一- 可以配合
GROUP BY
使用,但要注意执行顺序 - 在不同数据库系统中可能存在细微的语法差异
数据查询-Order by
-- 简单查询 查询表中数据进行排序
use DataQueryStudy;
-- 创建学生表
CREATE table student(
id int primary key comment '编号', -- 学生编号
name varchar(64) COMMENT '姓名', -- 学生姓名
score int comment '分数', -- 学生成绩
classId int comment'班级编号' -- 所属班级编号
);
-- 创建班级表
create table Classs(
id int , -- 班级编号
name varchar(64) COMMENT '姓名' -- 班级名称
);
-- 插入班级数据
insert into classs values(101,'初一一班 -?');
insert into classs values(102,'初一二班 -.');
insert into classs values(103,'初一三班 -,');
-- 插入学生数据
insert into student values( 101001,'张三',65,101);
insert into student values( 102001,'李四',68,102);
insert into student values( 103001,'王五',62,103);
-- 查询学生表中所有数据
select * from student;
-- 查询学生表中所有数据,并按分数降序排序
select * from student order by score desc;
-- 查询学生表中所有数据,并按分数降序排序,若分数相同则班级编号升序排序
select * from student order by score desc, classId asc;
-- 查询学生表中所有数据,并按分数降序排序,按照班级编号升序排序
select * from student order by score desc, classId asc;
## 插入101002的数据
insert into student values( 101002,'赵六',70,101);
-- 查询学生表中所有数据,并按分数降序排序,若分数相同则班级编号升序排序
select * from student order by score desc, classId asc;
##按照班级编号升序排序 并且成绩降序排序
select * from student order by classId asc, score desc;
-- 查询学生表中所有数据,并按班级编号升序排序
select * from student order by classId asc;
#插入102001的数据
insert into student values( 102002,'钱七',75,102);
#插入103001的数据
insert into student values( 103002,'孙八',80,103);
-- 查询学生表中所有数据,并按班级编号升序排序,若班级编号相同则分数降序排序
select * from student order by classId asc, score desc;
# 按照成绩 降序排序,若成绩相同则按照班级编号升序排序
select * from student order by score desc, classId asc;