MySQL少有人知的排序方式

文 / @UTHEME

MySQL少有人知的排序方式

MySQL是目前应用最广泛的关系型数据库之一,它支持多种排序方式,通常情况下我们使用ORDER BY字段名 ASC(升序)或DESC(降序)就可以满足排序需求。但是遇到一些特殊的排序,单单使用字段名就无法满足需求了,本文就为大家介绍几个遇到过的排序方法。

一、准备工作

为了更好演示与理解,先准备一张学生表,加入编号、姓名、成绩三个字段,插入几条数据,如下图所示:

二、条件排序

需求一:成绩从高到低进行排序

直接使用ORDER BY examScore DESC即可实现。

需求二:成绩从高到低排序,并且没录入成绩的排在最前面

要实现该排序,可以使用IF函数,先判断成绩是否为空,为空则赋给一个最大值,再进行排序。语句为:

ORDER BY IF(examScore IS NULL,101,examScore) DESC

其中如果成绩为空,就赋值为101,然后按照DESC降序排序,这样,没录入成绩的就排在最前面了。

三、自定义排序

需求:张三李四排在最前面,其他学生按照成绩从高到低排序

使用MySQL自带的FIELD函数即可实现。语句为:

ORDER BY FIELD(studentName,'张三','李四') ASC, examScore DESC

其中,FIELD函数返回对应字符串的索引,'张三'对应的索引为1,'李四'对应的索引为2。因此,先按照姓名排序,'张三'和'李四'排在最前面,然后按照成绩降序排序即可。

如果要把'张三'和'李四'编排到最后面,可以进行如下修改:

ORDER BY FIELD(studentName,'李四','张三') DESC, examScore DESC

结果如下图所示:

另外,FIND_IN_SET函数也可以实现自定义排序,而且性能更优:

ORDER BY FIND_IN_SET(studentName,'李四,张三') DESC, examScore DESC

四、汉字拼音首字母排序

有些朋友就奇怪了,汉字排序直接使用普通的ORDER BY字段名 ASC/DESC就行了,为什么说鲜为人知呢?

其实,如果用户创建表字段使用GBK字符集时,直接使用ORDER BY字段名 ASC/DESC就能解决,但是如果用户使用utf8字符集,简单的排序语句就无法满足需求了,因为utf8字符集不支持汉字排序。此时,只需把字段转换为GBK就行了,语句为:

ORDER BY CONVERT(studentName USING GBK) ASC

这样,就可以根据汉字的拼音首字母进行排序了,效果如下图所示:

五、总结

MySQL是一款强大的关系型数据库,它提供了多种排序方式,本文也为大家介绍了一些较为少见的排序方式,有了这些技巧,相信大家在进行排序时会更加得心应手。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。