话说那日,本咸鱼刚把早朝(早会)熬完,正打算回养心殿摸鱼,就听见御前太监小桂子一路小跑:“皇上,不好了!文武百官打起来了!”
我一拍龙椅:“反了?为了几两碎银至于吗!”
小桂子喘得跟破风箱似的:“不是银子,是排序!吏部要把‘状元’排第一,户部偏说‘榜眼’更富,礼部又跳出来说按姓氏笔画,结果三方人马把金銮殿吵成了菜市场。”
我扶额,心想:这不就是MySQL里ORDER BY没写明白嘛!于是大手一挥:“宣——SQL大学士觐见!”
SQL大学士迈着四方步进来,先甩了甩袖子,清了清嗓子:“诸位莫慌,待本官上表一道SQL奏折。”
他掏出小本本,唰唰写下:
SELECT 姓名, 功名, 俸禄 FROM 科举榜 ORDER BY 功名 DESC, 俸禄 DESC;
“诸位请看,功名降序,俸禄再降序,状元自然在前,榜眼随后。若有人不服,再加第三排序键——姓氏笔画,敢有不从?”
礼部尚书跳出来:“那要是有人并列第一呢?”
大学士微微一笑:“那就 LIMIT 3,前三名上殿领赏,其余回家吃自己。”
百官瞬间安静,齐呼:“皇上圣明!”
我暗笑:这群家伙,平时批奏折慢得跟乌龟,抢排名倒是一个比一个快。
正得意间,小桂子又来报:“皇上,新科进士里有人姓‘丌’,笔画只有两画,排最前,他不干了,说显得自己像走后门。”
我翻白眼:MySQL里还有ORDER BY CONVERT(姓名 USING gbk) COLLATE gbk_chinese_ci这种骚操作,直接按拼音排,笔画妖怪一边凉快去!
大学士会意,立刻改写:
SELECT 姓名, 功名 FROM 科举榜 ORDER BY CONVERT(姓名 USING gbk) COLLATE gbk_chinese_ci ASC;
丌进士看完,满意点头:“这回我像凭实力考上的了!”
我长叹:当皇帝真累,不但要懂制衡,还得懂排序。
【教程番外篇:MySQL排序的十八般武艺】
基本语法
ORDER BY 列名 【ASC|DESC】
例:SELECT * FROM 表 ORDER BY 成绩 DESC;
多列排序
先按主要列排,再按次要列排:
ORDER BY 成绩 DESC, 年龄 ASC;
自定义顺序
用FIELD函数:
ORDER BY FIELD(职称,'院士','教授','副教授','讲师');
中文排序
· 按拼音:ORDER BY CONVERT(姓名 USING gbk) COLLATE gbk_chinese_ci ASC;
· 按笔画:ORDER BY CONVERT(姓名 USING utf8) COLLATE utf8_unicode_ci ASC;
NULL值处理
· MySQL8.0+:ORDER BY 成绩 IS NULL, 成绩 DESC; 把NULL放最后。
· 旧版:ORDER BY IF(成绩 IS NULL,1,0), 成绩 DESC;
随机排序
ORDER BY RAND(); 适合抽奖,记得加LIMIT,不然全表变蜗牛。
表达式排序
按计算结果排:ORDER BY (语文+数学+英语) DESC;
性能小贴士
· 给排序列加索引,别让皇帝等奏折。
· 大分页用“延迟关联”:先SELECT主键LIMIT,再JOIN原表。
至此,排序秘籍传授完毕,诸位爱卿若再争吵,拖出去——加索引!