前言

第五天,冲鸭~

我们昨天知道怎么检索数据了,借助select语句,我们可以对数据检索,但是昨天提到了,返回的数据是没有排序的。今天我们将学习如何排序检索数据,也就是说检索后的数据是排过序的。

子句

先回顾一下select语句的用法

SELECT
	chinese 
FROM
	grade

除了select语句之外,还有from语句,我们把from语句叫做子句。

子句(clause) SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。

上面的from子句就是必须的。

ORDER BY子句

首先了解一下ORDER BY子句,我们将借助这个子句来对数据进行排序(默认是升序排序)

先看一个例子

SELECT
	chinese 
FROM
	grade 
ORDER BY
	chinese

解释:它与之前的例子相比多了ORDER BY子句,它的意思是从grade表中选择Chinese列,输出的结果按Chinese 列升序排列。

MySQL distinct 检索机制 mysql search_升序

ORDER BY子句后面跟一个或者多个列名,上面的例子就是按一个列排序。

问题来了,上面的例子中,我检索的是chinese列,我排序的是也是chinese列,是不是ORDER BY子句的用法就是这样的呢?其实不是的,尽管通常情况下,ORDER BY子句后面跟的列名与检索的列名会保持一致,但是不一致也是合理的

我们看这个例子,下面的例子就是检索的列和排序的列不一样,那结果为啥是这样的呢?

MySQL distinct 检索机制 mysql search_升序_02


我们来看原来的表,我们知道是按math列排序的,第三条记录的math值最小,所以我们检索后的结果第一行是94(也就是第三条记录的chinese列的值)

MySQL distinct 检索机制 mysql search_升序_03

多列排序

前面我们提到
ORDER BY子句后面跟一个或者多个列名,我们考虑后面跟多个列的情况,也就是按多列排序,看下面的例子

MySQL distinct 检索机制 mysql search_多列_04


特别注意多列排序的原则,他是先按照Chinese列排序,如果存在两个相同的值(比如第四条,第五条chinese列的值相同),就按math列排列(同样是按降序排列,只排列重复的那几行),如果第二列也有重复的,则按第三列排列,依次类推。若第一列排列没有重复的,就只按第一列排列,不管后面的。

总结如下,多列排序遵从如下规律
1、按第一列排序,若第一列没有重复记录,则结束;若存在重复记录,进行第二步
2、对重复的记录,按第二列排序,若重复,按第三列排列,重复第一步,若没有,则结束
3、若所有列都排序,则结束

指定排序方向

降序排列

前面不管是多列还是单列,都是升序排列,那么我想降序排列怎么办呢?

这时候就需要借助关键字DESC

MySQL distinct 检索机制 mysql search_数据_05


用法是在列名后面加上关键字DESC,就可以实现降序排列,若不加,则默认的是升序排列。关键字DESC,只作用到它前面的那一列,什么意思呢?

MySQL distinct 检索机制 mysql search_MySQL distinct 检索机制_06


这个例子的意思是,先按第一列,升序排列,重复行按第二列降序排列,显然,DESC没有作用到chinese列。

注意与我们之前学习的关键字DISTINCT(作用于所有)的区别。

如果要对每一列都实现降序排列,则需要在每一列后面都加关键字DESC

MySQL distinct 检索机制 mysql search_升序_07

升序排列

升序排列的关键字是ASC,用法与DESC类似,但是用它的意义不大,因为默认就是升序排列。

综合应用

我们昨天学习了LIMIT的用法,那么现在来尝试解决一个实际问题

就是我现在需要选择数学分数最高的那条记录(假定这条记录只有一条),怎么实现呢

MySQL distinct 检索机制 mysql search_升序_08

还有一些实际例子,比如牛客网的一些习题可以尝试做,又或者选择英语最低分的记录,快去试试吧?

这里要强调的是子句的顺序问题**,order by子句必须在from子句后面,关键字limit又必须在order by子句后面。**顺序颠倒会出现错误

后面我们会学习更多的子句,要记住order by子句必须是SQL语句中的最后一条子句。