查询到正确的数据以后,经常还需要控制显示顺序。商品列表可能按价格从低到高,订单可能让最新的排在最前面,排行榜则希望最高分先出现。SQL 使用 ORDER BY 排序;如果只想返回前几条,还可以配合 LIMIT。
使用 ORDER BY 排序
ORDER BY price 会按照价格排序。没有指定方向时,很多数据库默认使用 升序(Ascending);写成 ORDER BY price ASC 更明确。
| id | name | price | category |
|---|---|---|---|
| 1 | Keyboard | 80.00 | Electronics |
| 2 | Mouse | 40.00 | Electronics |
| 3 | Coffee Mug | 15.00 | Home |
| 4 | Backpack | 60.00 | Fashion |
SELECT *
FROM products
ORDER BY price ASC;| 方向 | 数字 | 日期 |
|---|---|---|
ASC ↑ | 从小到大 | 从早到晚 |
DESC ↓ | 从大到小 | 从晚到早 |
DESC 从大到小
ORDER BY price DESC 会依次得到 Keyboard、Backpack、Mouse、Coffee Mug。文字依据数据库的字符排序规则排列;日期也可以倒序,因此消息、订单和日志常用 ORDER BY order_date DESC 把最新记录放在前面。
按照多个 Column 排序
ORDER BY category ASC, price DESC 先比较 category。只有两条 Row 的 category 相同时,才继续比较 price。多字段排序常用于报表和后台列表。
SELECT *
FROM products
ORDER BY category ASC, price DESC;使用 LIMIT 限制数量
一张表可能有数百万条 Row,但页面只需要前三个最贵商品。先按价格降序,再写 LIMIT 3。如果只写 LIMIT 而没有 ORDER BY,数据库返回某三条数据,但不能依赖它们按 id、价格或其他固定顺序出现。Row 没有应被假设的天然顺序。
SELECT *
FROM products
ORDER BY price DESC
LIMIT 3;MySQL、PostgreSQL 和 SQLite 常用 LIMIT。SQL Server 常见 TOP 或分页语法。产品语法会变,核心思路不变:先定义顺序,再决定取多少条。
把 WHERE、ORDER BY 和 LIMIT 组合起来
“找出价格大于 20 的商品,按价格从高到低,只显示前两个”可以拆成 products、price > 20、price DESC、LIMIT 2,再顺序组合。查询并不是一次神秘操作,而是几个简单规则共同塑造 Result Set。
SELECT name, price
FROM products
WHERE price >= 40
ORDER BY price DESC
LIMIT 3;重排真实的 Result Set
改变 ASC、DESC、排序列和 LIMIT,运行后观察真实 Row 顺序。
| id | name | city | |
|---|---|---|---|
| 1 | Alice | [email protected] | Tokyo |
| 2 | Bob | [email protected] | Osaka |
| 3 | Chris | [email protected] | Tokyo |
| 4 | Diana | [email protected] | Kyoto |
沙盒已准备好,不会连接真实数据库。知识测验
写出稳定的 Top-N 查询
完成两条查询:
① 返回价格大于 20 的三个最贵商品,只显示 name 和 price;
② 返回所有订单,先按日期从新到旧,同一天再按 id 从大到小。验收标准:子句顺序正确,两个降序规则明确,第一条包含 LIMIT 3。
可选:通用练习数据脚本
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS products;
CREATE TABLE products (id INTEGER, name VARCHAR(100), price DECIMAL(10,2), category VARCHAR(50));
CREATE TABLE orders (id INTEGER, user_id INTEGER, product_id INTEGER, quantity INTEGER, order_date DATE);
INSERT INTO products VALUES
(1,'Keyboard',80.00,'Electronics'), (2,'Mouse',40.00,'Electronics'),
(3,'Coffee Mug',15.00,'Home'), (4,'Backpack',60.00,'Fashion');
INSERT INTO orders VALUES
(1,1,2,1,'2026-08-01'), (2,1,3,2,'2026-08-03'),
(3,2,1,1,'2026-08-05'), (4,3,4,1,'2026-08-06');你已经完成了查询数据的第一轮工具箱。 现在你能选择列、筛选行、表达模式和范围、处理缺失值,并把结果排成可用的顺序。接下来的知识会继续建立在同一套 users、products 和 orders 数据上;SQL 会变长,但思考方式仍然是把问题拆成一条条清楚的规则。