您好!欢迎访问家园网-www.jy.wang!

家园网

MySQL 中的 ORDER BY 语句

网络 作者:本站 点击:

1. ORDER BY 语法

SELECT 列名1, 列名2, ...

FROM 表名

WHERE 条件

ORDER BY 列名1 排序方式, 列名2 排序方式;


ORDER BY 后可以跟一个或多个列。

ASC(默认)表示升序,DESC 表示降序。

2. ORDER BY 基本用法

(1) 按单列排序

SELECT * FROM users ORDER BY age;


默认是升序,等同于:

SELECT * FROM users ORDER BY age ASC;


如果想降序排序:

SELECT * FROM users ORDER BY age DESC;


(2) 按多个列排序

SELECT * FROM users ORDER BY age DESC, name ASC;


解释:

先按 age 降序排序(大的在前)。

如果 age 相同,再按 name 升序排序(字母顺序)。

(3) ORDER BY 结合 WHERE

SELECT * FROM users WHERE city = 'Shanghai' ORDER BY age DESC;


解释:

只查询 city='Shanghai' 的用户,并按 age 降序排列。

3. ORDER BY 结合 LIMIT

如果数据量大,可以配合 LIMIT 提高查询效率:

SELECT * FROM users ORDER BY age DESC LIMIT 10;


只取年龄最大的前 10 条数据。

获取第 11 到 20 条数据(分页查询):

SELECT * FROM users ORDER BY age DESC LIMIT 10 OFFSET 10;


或者:

SELECT * FROM users ORDER BY age DESC LIMIT 10, 10;


4. ORDER BY 结合 CASE(自定义排序)

有时候,排序方式不能直接用 ASC 或 DESC,比如:

status 可能是 'active'、'inactive'、'pending',希望 'active' 排最前。

SELECT * FROM users

ORDER BY 

  CASE status

    WHEN 'active' THEN 1

    WHEN 'pending' THEN 2

    WHEN 'inactive' THEN 3

  END;


解释:

'active' → 1(排最前)。

'pending' → 2(其次)。

'inactive' → 3(排最后)。

5. ORDER BY 结合 RAND()(随机排序)

如果想要随机返回数据:

SELECT * FROM users ORDER BY RAND() LIMIT 5;


返回随机的 5 条记录。

⚠ 注意:

ORDER BY RAND() 在大数据量时性能较低,会对所有行进行随机排序,建议使用 TABLESAMPLE(如果支持)或其他优化方法。

6. ORDER BY 结合 FIELD()(自定义顺序排序)

如果有一些特殊情况,比如手动设定某些值排在前面:

SELECT * FROM users

ORDER BY FIELD(role, 'admin', 'moderator', 'user', 'guest');


解释:

admin 排最前。

moderator 其次。

user 再其次。

guest 最后。

7. ORDER BY 结合 CHAR_LENGTH()(按字符串长度排序)

如果想按照字符串长度排序:

SELECT * FROM users ORDER BY CHAR_LENGTH(name) ASC;


解释:

name 长度短的排前面,长的排后面。

如果长度相同时,再按字母顺序排:

SELECT * FROM users ORDER BY CHAR_LENGTH(name) ASC, name ASC;


8. ORDER BY 对 NULL 值的处理

默认情况下:

ORDER BY ASC 时,NULL 排在最前。

ORDER BY DESC 时,NULL 排在最后。

如果希望 NULL 始终排最后:

SELECT * FROM users ORDER BY ISNULL(age), age ASC;


或者(MySQL 8.0+ 支持):

SELECT * FROM users ORDER BY age IS NULL ASC, age ASC;


解释:

ISNULL(age) 先把 NULL 排到最后。

其他 age 按升序排列。

9. ORDER BY 性能优化

(1) 确保字段有索引

如果 ORDER BY 的字段没有索引,排序时 MySQL 需要创建临时表,影响性能:

ALTER TABLE users ADD INDEX idx_age (age);


(2) 避免 ORDER BY RAND() 大表全表扫描

推荐更高效的随机查询:

SELECT * FROM users WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM users))) LIMIT 5;


(3) LIMIT 配合 索引

大表查询时,ORDER BY + LIMIT 可能导致 MySQL 扫描大量数据,建议索引优化:

SELECT * FROM users WHERE age > 30 ORDER BY age DESC LIMIT 10;


如果 age 字段有索引,查询效率会更高。

10. ORDER BY 总结

用法语法示例说明

升序排序ORDER BY age ASC默认,从小到大

降序排序ORDER BY age DESC从大到小

多列排序ORDER BY age DESC, name ASCage 降序,相同时按 name 升序

LIMIT 分页ORDER BY age DESC LIMIT 10 OFFSET 10取第 11-20 条数据

自定义顺序ORDER BY FIELD(status, 'active', 'pending', 'inactive')active 优先

随机排序ORDER BY RAND()性能较差

按长度排序ORDER BY CHAR_LENGTH(name) ASC字符串短的排前面

NULL 处理ORDER BY ISNULL(age), age ASCNULL 排最后

🔥 重点总结

默认 ASC 升序,DESC 降序。

多个字段排序时,优先级按字段顺序。

LIMIT 配合 ORDER BY 提高查询效率。

RAND() 适用于小表,大表可优化随机查询。

自定义排序可用 FIELD() 或 CASE。

NULL 默认排在 ASC 最前,DESC 最后。

这样,你的 ORDER BY 查询就更高效、更灵活了!🚀


原文链接:https://blog.csdn.net/weixin_41405524/article/details/146442091



标签: