文章目录
前言
在日常开发中,我们经常需要对数据库中的数据进行排序展示,比如"按时间最新排序"、"按价格从高到低"、"按姓名字母顺序"等。在SQL中,实现这些排序功能的核心就是 ASC
和 DESC
关键字。本文将详细讲解它们的含义、用法和实际应用场景。
一、ASC和DESC的基本概念
1、什么是ASC和DESC?
ASC
和 DESC
是SQL中用于指定排序顺序 的关键字,必须与 ORDER BY
子句配合使用。
ASC
:代表 Ascending(升序),即从小到大、从早到晚、从A到Z的顺序。DESC
:代表 Descending(降序),即从大到小、从晚到早、从Z到A的顺序。
✅ 重要提示 :如果不显式指定排序方式,SQL默认使用
ASC
升序。
2、基本语法
sql
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
ORDER BY
后面可以跟一个或多个列。- 多个列时,按从左到右的优先级进行排序(先按第一列排,相同再按第二列排)。
3、查询实战
ASC

DESC
二、实际代码示例
为了更好地理解,我们创建一个学生表 students
并插入一些测试数据。
1、建表与插入数据
sql
-- 创建学生表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
score DECIMAL(5,2),
birth_date DATE
);
-- 插入测试数据
INSERT INTO students (name, score, birth_date) VALUES
('Alice', 85.5, '2005-03-15'),
('Bob', 92.0, '2004-07-22'),
('Carol', 78.0, '2006-01-10'),
('David', 92.0, '2005-11-05'),
('Eve', 85.5, '2005-06-18');
当前数据如下:
id | name | score | birth_date |
---|---|---|---|
1 | Alice | 85.5 | 2005-03-15 |
2 | Bob | 92.0 | 2004-07-22 |
3 | Carol | 78.0 | 2006-01-10 |
4 | David | 92.0 | 2005-11-05 |
5 | Eve | 85.5 | 2005-06-18 |
2、使用ASC升序排序
示例1:按分数升序排列(低分在前)
sql
SELECT * FROM students ORDER BY score ASC;
结果:
id | name | score | birth_date |
---|---|---|---|
3 | Carol | 78.0 | 2006-01-10 |
1 | Alice | 85.5 | 2005-03-15 |
5 | Eve | 85.5 | 2005-06-18 |
2 | Bob | 92.0 | 2004-07-22 |
4 | David | 92.0 | 2005-11-05 |
✅ 解释:分数从低到高排序,78 → 85.5 → 92.0。
示例2:按姓名字母升序排列
sql
SELECT * FROM students ORDER BY name ASC;
结果:
id | name | score | birth_date |
---|---|---|---|
Carol | 78.0 | 2006-01-10 | |
David | 92.0 | 2005-11-05 | |
Eve | 85.5 | 2005-06-18 | |
Alice | 85.5 | 2005-03-15 | |
Bob | 92.0 | 2004-07-22 |
✅ 解释:按字母顺序 A → B → C → D → E。
3、使用DESC降序排序
示例3:按分数降序排列(高分在前)
sql
SELECT * FROM students ORDER BY score DESC;
结果:
id | name | score | birth_date |
---|---|---|---|
2 | Bob | 92.0 | 2004-07-22 |
4 | David | 92.0 | 2005-11-05 |
1 | Alice | 85.5 | 2005-03-15 |
5 | Eve | 85.5 | 2005-06-18 |
3 | Carol | 78.0 | 2006-01-10 |
✅ 解释:分数从高到低排序,92.0 → 85.5 → 78.0。
示例4:按出生日期降序(最新出生的在前)
sql
SELECT * FROM students ORDER BY birth_date DESC;
结果:
id | name | score | birth_date |
---|---|---|---|
3 | Carol | 78.0 | 2006-01-10 |
5 | Eve | 85.5 | 2005-06-18 |
4 | David | 92.0 | 2005-11-05 |
1 | Alice | 85.5 | 2005-03-15 |
2 | Bob | 92.0 | 2004-07-22 |
✅ 解释:从最近的日期排到最早的日期。
三、多列排序(组合使用ASC和DESC)
有时我们需要按多个条件排序。例如:先按分数降序,分数相同再按姓名升序。
sql
SELECT * FROM students
ORDER BY score DESC, name ASC;
结果:
id | name | score | birth_date |
---|---|---|---|
2 | Bob | 92.0 | 2004-07-22 |
4 | David | 92.0 | 2005-11-05 |
1 | Alice | 85.5 | 2005-03-15 |
5 | Eve | 85.5 | 2005-06-18 |
3 | Carol | 78.0 | 2006-01-10 |
✅ 解释:
- 分数92.0的两人:Bob 和 David,按姓名升序排,Bob(B)在前,David(D)在后。
- 分数85.5的两人:Alice 和 Eve,Alice(A)在前,Eve(E)在后。
四、常见应用场景
场景 | SQL示例 |
---|---|
最新文章 | SELECT * FROM articles ORDER BY created_at DESC |
价格从低到高 | SELECT * FROM products ORDER BY price ASC |
销量排行榜 | SELECT * FROM products ORDER BY sales_count DESC |
按部门+工资排序 | SELECT * FROM employees ORDER BY department ASC, salary DESC |
五、注意事项
-
NULL值的处理:
- 在大多数数据库中,
NULL
值在ASC
排序中会排在最前面或最后面,具体取决于数据库(MySQL中ASC
时NULL
在前,DESC
时在后)。 - 可通过
IS NULL
或COALESCE
控制。
- 在大多数数据库中,
-
性能优化:
- 对经常用于排序的列(如
created_at
,score
)建立索引,可大幅提升查询速度。
- 对经常用于排序的列(如
-
大小写敏感:
- 字符串排序可能受数据库的排序规则(Collation)影响,如
utf8mb4_general_ci
是不区分大小写的。
- 字符串排序可能受数据库的排序规则(Collation)影响,如
六、总结
关键字 | 含义 | 示例 |
---|---|---|
ASC |
升序(从小到大) | ORDER BY score ASC |
DESC |
降序(从大到小) | ORDER BY score DESC |
(默认) | 等同于 ASC |
ORDER BY name |
通过本文的学习,你应该已经掌握了 ASC
和 DESC
的核心用法。记住:ASC
是从小到大,DESC
是从大到小 ,结合 ORDER BY
可以灵活控制查询结果的展示顺序,是SQL中最基础也最重要的功能之一。