学习笔记-MySQL ORDER BY(排序) 语句
在 MySQL 中,ORDER BY 子句用于对查询结果进行排序。以下是详细的语法规则和使用场景:
基础语法
▼sql复制代码SELECT column1, column2 FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
- ASC:升序(默认)
- DESC:降序
核心功能
1. 单列排序
▼sql复制代码-- 按 age 升序排列(默认 ASC) SELECT name, age FROM employees ORDER BY age; -- 按 salary 降序排列 SELECT * FROM products ORDER BY price DESC;
2. 多列排序
▼sql复制代码-- 先按 department 升序,同部门按 salary 降序 SELECT name, department, salary FROM employees ORDER BY department ASC, salary DESC;
3. 按表达式或函数排序
▼sql复制代码-- 按名字长度排序 SELECT name, LENGTH(name) AS len FROM users ORDER BY len DESC; -- 按计算字段排序 SELECT product, (price * stock) AS total_value FROM inventory ORDER BY total_value DESC;
4. 自定义排序顺序
使用 FIELD() 函数实现特定顺序:
▼sql复制代码-- 按 status 自定义顺序:'active' > 'pending' > 'expired' SELECT id, status FROM orders ORDER BY FIELD(status, 'active', 'pending', 'expired');
5. NULL 值处理
▼sql复制代码-- 默认 NULL 在升序中排在最前,可用以下方式调整 SELECT name, commission FROM sales ORDER BY commission IS NULL, commission DESC; -- NULL 值排在最后
高级特性
1. 随机排序
▼sql复制代码-- 随机取 5 条记录(慎用,性能较差) SELECT * FROM articles ORDER BY RAND() LIMIT 5;
2. 中文拼音排序
需设置字符集和校对规则:
▼sql复制代码SELECT name FROM employees ORDER BY CONVERT(name USING gbk) COLLATE gbk_chinese_ci;
3. 动态排序(结合 CASE)
▼sql复制代码-- 根据参数动态选择排序字段 SET @sort_by = 'price'; SELECT * FROM products ORDER BY CASE WHEN @sort_by = 'price' THEN price WHEN @sort_by = 'sales' THEN sales END DESC;
性能优化建议
- 索引利用:为排序字段添加索引(尤其是多列排序时创建组合索引)。
▼sql复制代码
CREATE INDEX idx_dept_salary ON employees(department, salary); - 避免全表扫描:
WHERE条件应尽量缩小数据集。 - 文件排序(Filesort):当无法使用索引时,MySQL 会进行磁盘排序,可通过
EXPLAIN检查是否出现Using filesort。 - Limit 优化:分页时优先筛选后排序:
▼sql复制代码
SELECT * FROM large_table WHERE id > 1000 ORDER BY create_time LIMIT 20;
典型错误示例
▼sql复制代码-- 错误:GROUP BY 后直接排序需注意聚合字段 SELECT department, AVG(salary) FROM employees GROUP BY department ORDER BY AVG(salary) DESC; -- 正确写法应在 ORDER BY 中重复聚合函数
通过合理使用 ORDER BY,可以实现灵活的数据排序逻辑,但需注意性能影响,尤其是在处理大数据集时。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
