数据库-数据查询-Order by

引言

排序算法是计算机科学中最基础且应用最广泛的算法之一,几乎渗透在编程开发的各个领域。从简单的学生成绩排名到复杂的数据库查询优化,排序的身影无处不在。

具体来说,排序算法的高频使用主要体现在以下几个方面:

  1. 数据处理与分析
  • 在数据分析中,经常需要对海量数据进行排序以便快速查找
  • 例如电商平台需要将商品按价格、销量等维度排序展示
  1. 系统性能优化
  • 数据库索引通常使用B树等排序结构来提高查询效率
  • 操作系统中的任务调度也依赖于优先级排序
  1. 基础算法实现
  • 许多算法如二分查找、归并排序都依赖于有序数据集
  • 图形学中的Z-buffer算法需要对多边形进行深度排序
  1. 日常应用场景
  • 手机通讯录按字母顺序排序
  • 音乐播放列表按添加时间或播放次数排序
  • 社交媒体信息流按时间倒序排列
  1. 算法面试考察
  • 排序算法是技术面试中的必考知识点
  • 常见考察点包括时间复杂度分析和优化思路

在实际开发中,不同的排序算法各有优劣:

  • 快速排序在平均情况下性能最优
  • 归并排序适合大数据量的外部排序
  • 计数排序在特定范围内具有线性时间复杂度

因此,深入理解各种排序算法的原理和适用场景,是每个程序员必备的基本功。

ORDER BY 是 SQL 查询语句中用于对结果集进行排序的子句。它可以根据一个或多个列对查询结果进行升序(ASC)或降序(DESC)排列,是数据处理和分析中非常常用的功能。

基本语法

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;

详细功能说明

  1. 单列排序

    -- 按员工姓名升序排列
    SELECT * FROM employees ORDER BY last_name ASC;
    
    -- 按工资降序排列
    SELECT * FROM employees ORDER BY salary DESC;
    
  2. 多列排序

    -- 先按部门升序,再按工资降序
    SELECT * FROM employees ORDER BY department_id ASC, salary DESC;
    
  3. 排序规则

    • 数值类型:按数值大小排序
    • 字符串类型:按字母顺序排序
    • 日期类型:按时间先后排序
    • NULL 值:默认放在最后(可通过 NULLS FIRST/LAST 调整)
  4. 性能考虑

    • 排序操作会消耗较多资源
    • 大数据量排序时建议添加适当的索引
    • 可以使用 LIMIT 减少排序数据量

实际应用场景

  1. 电商网站商品列表按价格排序
  2. 学生成绩单按分数高低排序
  3. 新闻网站文章按发布时间排序
  4. 销售报表按销售额排序

注意事项

  1. ORDER BY 是 SQL 语句中最后执行的子句之一
  2. 可以配合 GROUP BY 使用,但要注意执行顺序
  3. 在不同数据库系统中可能存在细微的语法差异

数据查询-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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值