基本语法

SELECT 字段列表

FROM 表名

[WHERE 条件]

ORDER BY 字段1 [ASC|DESC], 字段2 [ASC|DESC], ...;

 

 `ASC`:升序排列(默认值,可省略)

 `DESC`:降序排列

 

排序方式

1. 单字段排序

按身高升序排列(默认ASC)

SELECT * FROM tb_students_info ORDER BY height;

按身高降序排列

SELECT * FROM tb_students_info ORDER BY height DESC;

 

2. 多字段排序

先按身高降序,再按姓名升序

SELECT name, height 
FROM tb_students_info


多字段排序规则:

 首先按第一个字段排序

 当第一个字段值相同时,再按第二个字段排序

 以此类推

 

3. 按表达式排序

按姓名长度排序

SELECT name, LENGTH(name) AS name_length
FROM tb_students_info
ORDER BY LENGTH(name) DESC;


4. 按字段位置排序

按SELECT中的第2列(height)排序

SELECT name, height FROM tb_students_info ORDER BY 2 DESC;


特殊排序情况

1. NULL 值处理

 默认情况下,NULL 值被视为最小值

 在升序排序中出现在最前面,降序排序中出现在最后面

假设height可能有NULL值

SELECT name, height FROM tb_students_info ORDER BY height


将NULL值放在最后(升序时)

SELECT name, height 
FROM tb_students_info 
ORDER BY IF(ISNULL(height), 1, 0, height;

2. 自定义排序顺序

按自定义部门顺序排序

SELECT name, dept_id 
FROM tb_students_info
ORDER BY FIELD(dept_id, 3, 1, 4, 2, 6);

高级排序技巧

1. 与 LIMIT 结合使用

获取身高最高的5名学生

SELECT name, height
FROM tb_students_info
ORDER BY height DESC
LIMIT 5;

2. 与 DISTINCT 结合使用

获取不同的年龄并按降序排列

SELECT DISTINCT age FROM tb_students_info ORDER BY age DESC;

3. 与聚合函数结合使用

按平均身高排序各部门

SELECT dept_id, AVG(height) AS avg_height
FROM tb_students_info
GROUP BY dept_id
ORDER BY avg_height DESC;

性能优化建议

1. 为排序字段建立索引:特别是经常用于排序的字段

2. 避免排序大结果集:尽量使用 WHERE 子句先过滤数据

3. 注意混合排序方向:`ORDER BY 字段1 ASC, 字段2 DESC` 可能无法有效使用索引

4. 使用覆盖索引:如果只需要索引列,可以减少排序操作

5. 限制排序数据量:结合 LIMIT 使用

实际应用示例

示例1:电商产品排序

按价格从低到高,评分从高到低排序

SELECT product_name, price, rating
FROM products
WHERE category = 'electronics'
ORDER BY price ASC, rating DESC;


示例2:学生成绩排名

按总分降序排列,同分时按数学成绩降序

SELECT student_name, 
       (math_score + english_score + science_score) AS total_score,
       math_score
FROM exam_results
ORDER BY total_score DESC, math_score DESC;


示例3:分页排序查询

第2页,每页10条,按注册时间降序

SELECT user_id, username, register_date
FROM users
ORDER BY register_date DESC
LIMIT 10 OFFSET 10;

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)