MySQL 中的 ORDER BY 语句

06-01 1258阅读

MySQL 中的 ORDER BY 语句

ORDER BY 语句用于对查询结果进行排序,可以按照单个或多个字段,以**升序(ASC)或降序(DESC)**排列。


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()(自定义顺序排序)

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

              MySQL 中的 ORDER BY 语句
              (图片来源网络,侵删)
              SELECT * FROM users
              ORDER BY FIELD(role, 'admin', 'moderator', 'user', 'guest');
              

              解释:

              • admin 排最前。
              • moderator 其次。
              • user 再其次。
              • guest 最后。

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

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

                MySQL 中的 ORDER BY 语句
                (图片来源网络,侵删)
                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 排最后

                        🔥 重点总结

                        1. 默认 ASC 升序,DESC 降序。
                        2. 多个字段排序时,优先级按字段顺序。
                        3. LIMIT 配合 ORDER BY 提高查询效率。
                        4. RAND() 适用于小表,大表可优化随机查询。
                        5. 自定义排序可用 FIELD() 或 CASE。
                        6. NULL 默认排在 ASC 最前,DESC 最后。

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

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码