前言
第五天,冲鸭~
我们昨天知道怎么检索数据了,借助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 列升序排列。
ORDER BY
子句后面跟一个或者多个列名,上面的例子就是按一个列排序。
问题来了,上面的例子中,我检索的是chinese
列,我排序的是也是chinese
列,是不是ORDER BY
子句的用法就是这样的呢?其实不是的,尽管通常情况下,ORDER BY
子句后面跟的列名与检索的列名会保持一致,但是不一致也是合理的。
我们看这个例子,下面的例子就是检索的列和排序的列不一样,那结果为啥是这样的呢?
我们来看原来的表,我们知道是按math列排序的,第三条记录的math值最小,所以我们检索后的结果第一行是94(也就是第三条记录的chinese列的值)
多列排序
前面我们提到ORDER BY
子句后面跟一个或者多个列名,我们考虑后面跟多个列的情况,也就是按多列排序,看下面的例子
特别注意多列排序的原则,他是先按照Chinese列排序,如果存在两个相同的值(比如第四条,第五条chinese列的值相同),就按math列排列(同样是按降序排列,只排列重复的那几行),如果第二列也有重复的,则按第三列排列,依次类推。若第一列排列没有重复的,就只按第一列排列,不管后面的。
总结如下,多列排序遵从如下规律
1、按第一列排序,若第一列没有重复记录,则结束;若存在重复记录,进行第二步
2、对重复的记录,按第二列排序,若重复,按第三列排列,重复第一步,若没有,则结束
3、若所有列都排序,则结束
指定排序方向
降序排列
前面不管是多列还是单列,都是升序排列,那么我想降序排列怎么办呢?
这时候就需要借助关键字DESC
用法是在列名后面加上关键字DESC
,就可以实现降序排列,若不加,则默认的是升序排列。关键字DESC
,只作用到它前面的那一列,什么意思呢?
这个例子的意思是,先按第一列,升序排列,重复行按第二列降序排列,显然,DESC没有作用到chinese列。
注意与我们之前学习的关键字DISTINCT
(作用于所有)的区别。
如果要对每一列都实现降序排列,则需要在每一列后面都加关键字DESC
升序排列
升序排列的关键字是ASC
,用法与DESC
类似,但是用它的意义不大,因为默认就是升序排列。
综合应用
我们昨天学习了LIMIT
的用法,那么现在来尝试解决一个实际问题
就是我现在需要选择数学分数最高的那条记录(假定这条记录只有一条),怎么实现呢
还有一些实际例子,比如牛客网的一些习题可以尝试做,又或者选择英语最低分的记录,快去试试吧?
这里要强调的是子句的顺序问题**,order by子句必须在from子句后面,关键字limit又必须在order by子句后面。**顺序颠倒会出现错误
后面我们会学习更多的子句,要记住order by
子句必须是SQL语句中的最后一条子句。