学习笔记-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;

性能优化建议

  1. 索引利用:为排序字段添加索引(尤其是多列排序时创建组合索引)。
    sql
    复制代码
    CREATE INDEX idx_dept_salary ON employees(department, salary);
  2. 避免全表扫描WHERE 条件应尽量缩小数据集。
  3. 文件排序(Filesort):当无法使用索引时,MySQL 会进行磁盘排序,可通过 EXPLAIN 检查是否出现 Using filesort
  4. 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个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
鱼友6408
下载 APP