1月阅读周·MySQL数据库入门:高级查询之对查询结果排序篇
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》、《编写可测试的JavaScript代码》。
当前阅读周书籍:《MySQL数据库入门》。
对查询结果排序
从表中查询出来的数据可能是无序的,或者其排列顺序不是用户期望的。为了使查询结果满足用户的要求,可以使用ORDER BY对查询结果进行排序,其语法格式如下所示:
SELECT 字段名1,字段名2,…
FROM 表名
ORDER BY 字段名1 [ASC | DESC],字段名2 [ASC | DESC]…
在上面的语法格式中,指定的字段名1、字段名2等是对查询结果排序的依据。参数ASC表示按照升序进行排序,DESC表示按照降序进行排序。默认情况下,按照ASC方式进行排序。
【例1-1】 查出student表中的所有记录,并按照grade字段进行排序,SQL语句如下所示:
SELECT * FROM student
ORDER BY grade;
执行结果如下所示:
mysql>SELECT * FROM student
-> ORDER BY grade;
+----+------------+-------+--------+
| id | name | grade | gender |
+----+------------+-------+--------+
| 1 | songjiang | 40 | 男 |
| 5 | sunerniang | 66 | 女 |
| 6 | wusong | 86 | 男 |
| 4 | husanniang | 88 | 女 |
| 3 | qinming | 90 | 男 |
| 8 | yanqing | 90 | NULL |
| 7 | linchong | 92 | 男 |
| 2 | wuyong | 100 | 男 |
+----+------------+-------+--------+
8 rows in set (0.00 sec)
从查询结果可以看到,返回的记录按照ORDER BY指定的字段grade进行排序,并且默认是按升序排列。
【例1-2】 查出student表中的所有记录,使用参数ASC按照grade字段升序方式排列,SQL语句如下所示:
SELECT * FROM student ORDER BY grade ASC;
执行结果如下所示:
mysql>SELECT * FROM student ORDER BY grade ASC;
+----+------------+-------+--------+
| id | name | grade | gender |
+----+------------+-------+--------+
| 1 | songjiang | 40 | 男 |
| 5 | sunerniang | 66 | 女 |
| 6 | wusong | 86 | 男 |
| 4 | husanniang | 88 | 女 |
| 3 | qinming | 90 | 男 |
| 8 | yanqing | 90 | NULL |
| 7 | linchong | 92 | 男 |
| 2 | wuyong | 100 | 男 |
+----+------------+-------+--------+
8 rows in set (0.00 sec)
从查询结果可以看到,在ORDER BY中使用了ASC关键字,返回结果和例1-1查询的结果一致。
【例1-3】 查出student表中的所有记录,使用参数DESC按照grade字段降序方式排列,SQL语句如下所示:
SELECT * FROM student ORDER BY grade DESC;
执行结果如下所示:
mysql>SELECT * FROM student ORDER BY grade DESC;
+----+------------+-------+--------+
| id | name | grade | gender |
+----+------------+-------+--------+
| 2 | wuyong | 100 | 男 |
| 7 | linchong | 92 | 男 |
| 3 | qinming | 90 | 男 |
| 8 | yanqing | 90 | NULL |
| 4 | husanniang | 88 | 女 |
| 6 | wusong | 86 | 男 |
| 5 | sunerniang| 66 | 女 |
| 1 | songjiang | 40 | 男 |
+----+------------+-------+--------+
8 rows in set (0.00 sec)
从查询结果可以看到,在ORDER BY中使用了DESC关键字,返回的记录按照grade字段的降序进行排列。
在MySQL中,可以指定按照多个字段对查询结果进行排序,例如,将查出的student表中所有记录按照gender和grade字段进行排序。在排序过程中,会先按照gender字段进行排序,如果遇到gender字段值相同的记录,再把这些记录按照grade字段进行排序。
【例1-4】 查询student表中的所有记录,按照gender字段的升序和grade字段的降序进行排列,SQL语句如下所示:
SELECT * FROM student
ORDER BY gender ASC,grade DESC;
执行结果如下所示:
mysql>SELECT * FROM student
-> ORDER BY gender ASC,grade DESC;
+----+------------+-------+--------+
| id | name | grade | gender |
+----+------------+-------+--------+
| 8 | yanqing | 90 | NULL |
| 4 | husanniang | 88 | 女 |
| 5| sunerniang| 66| 女 |
| 2 | wuyong | 100 | 男 |
| 7 | linchong | 92 | 男 |
| 3 | qinming | 90 | 男 |
| 6 | wusong | 86 | 男 |
| 1 | songjiang | 40 | 男 |
+----+------------+-------+--------+
8 rows in set (0.00 sec)
从查询记录可以看到,返回的结果首先按照gender字段值的升序进行排序,然后gender值为“男”和“女”的记录分别再按照grade字段值的降序进行排列。
注意:在按照指定字段进行升序排列时,如果某条记录的字段值为NULL,则这条记录会在第一条显示,这是因为NULL值可以被认为是最小值,如例1-4中,显示的第一条记录其gender字段值为NULL。
总结
从表中查询出来的数据可能是无序的,或者其排列顺序不是用户期望的。为了使查询结果满足用户的要求,可以使用ORDER BY对查询结果进行排序。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)