以上我们为大家介绍了如何根据单列内容排序。事实上,ORDER BY还可以同时指定多列内容作为排序的依据,而且对应不同的呈现效果。例如,如果排序依据为A、B两列含有的内容,那么对应的表达式就会有两种:
这两种表达式会对应不同的排序效果。为了向大家讲清楚其中的原理,在具体操作之前,请大家先考虑以下场景。
劳伦斯在生活中是一位观赏鱼爱好者,他一共养了3条蓝鱼和3条红鱼。只要肯花时间,人和动物之间的感情可以变得很深厚,相信家有宠物的读者对此深有体会。虽然劳伦斯养的只是几条非常普通的观赏鱼,但是在他的细心照顾下,这6条鱼竟能听懂他的指令,按照颜色和大小来排序。
事实上,这里的“颜色”和“大小”就是两个排序依据。如果劳伦斯要使用ORDER BY来发出指令,那么对应的指令表达就会有两种:
现在请将这些鱼儿想象成数据,然后我们会模拟MySQL的操作思路,为大家介绍这两种表达式对应的不同结果。首先来看第一种排序效果:
在电影院排队入场要讲究“先来后到”,在这里也是一样的。瞧,由于在ORDER BY从句中,“颜色”排在了“大小”的前面,所以我会先根据“颜色”对鱼儿们排序,也就是把蓝鱼放在一起,把红鱼放在一起。
当这一步完成以后,我才会再根据“大小”来调整顺序。也就是以相同颜色为单位来比较大小。这样一来,蓝鱼就只能和蓝鱼比大小,而红鱼也就只能和红鱼比大小。
概括来讲,“ORDER BY颜色,大小”对应的操作是,首先忽略大小并根据鱼儿们的颜色进行分类,然后以相同颜色为单位做大小比较。接着我们再来看第二种表达式对应的结果:
还是同样的道理。你瞧,由于这一次“大小”在ORDER BY从句中排在了“颜色”的前面,所以我会先忽略颜色差异,将鱼儿们从小到大排列。当这一步完成以后,我再回过头来根据“颜色”排序,此时我就只能以相同大小为单位来调整顺序了。
也就是说,只有那些大小相同但颜色不同的鱼,才会被进一步根据“颜色”排序。概括来讲,“ORDER BY大小,颜色”对应的操作是:首先忽略颜色,让鱼儿们按照大小排序,然后以相同大小为单位来调整颜色顺序。好了,当大家掌握了以上知识以后,我们就开始实际操作吧。
如果李乔丹想让姑娘们根据“年龄”和“姓名”排序,就需要写两条SQL语句:
我们先来看例句(5)返回的结果。
由于在例句(5)中,“年龄”是首要排序依据,而“姓名”是次要排序依据,所以MySQL会先根据年龄从小到大对输出行排列。当这一步完成以后,MySQL才会再以同一年龄为单位,根据姓名首字母进行调整。
这引发的结果就是:从整体上看,输出行是按照年龄从小到大排列的;从局部上看,年龄相同的姑娘们会按照姓名首字母从A到Z排列。
接着,我们再来看例句(6)返回的结果。
同样的原理,在例句(6)中,“姓名”成了优先考虑的排序依据,而“年龄”则退居二线。所以MySQL会先根据姓名首字母排序,然后以相同首字母为单位按照年龄大小做顺序调整。
对应的显示结果为:从整体上看,输出行是按照姓名首字母从A到Z的顺序显示的;从局部上看,姓名首字母相同的姑娘们会再按照年龄从小到大排列。
除此以外,相信同学们都注意到了,例句(5)和例句(6)都默认将name和age两个排序键指定为升序(省略了关键词ASC)。事实上,我们完全可以分别将它们指定为升序或者降序:
排序键书写顺位的不同,以及搭配使用不同的升降序关键词,可能会实现不同的排序效果。下面我们再提出一种思考方式,帮助大家理解根据多列内容进行排序的原理。先来看下面这张表。
瞧,这张简易表中存在两列信息:水果和售价。由于品质不同,所以相同水果的售价会存在差异。那么现在就让我们先来看一看“ORDER BY水果,售价”会产生什么样的排序效果。
由于排序键“水果”排在了“售价”的前面,所以MySQL会先根据“水果”列信息的英文首字母排序。事实上,从显示结果来看,与其说是按照英文首字母排序的,不如说是按照水果种类进行分组的。当分组完成以后,MySQL就会对同组水果进行售价比较了。
接着,我们再来瞧一瞧“ORDER BY售价,水果”对应的排序结果。
我们同样可以从数据分组的角度来理解排序效果。大家可以看到,由于这一次是排序键“售价”排在了“水果”的前面,所以当MySQL首先根据售价排序时,它也根据不同售价规划出了7个小组。只不过在这7个小组中,只有“5”组含有多条信息,其余小组的信息都是单一的。因此,当MySQL再根据“水果”排序时,它就只能对“5”组含有的水果种类进行调整。
总而言之,这种方式就是从数据分组的角度进行分析:首先根据首要排序键进行分组,然后根据次要排序键进行同组比较并排序。
事实上,数据分组的思想与对应操作在SQL中的运用非常普遍,因为这会将具有同一标签的信息进行打包。虽然一些资料和图书都普遍将“数据分组”与GROUP BY画上等号,但是我希望大家可以将“数据分组”视为一个泛词,因为数据分组的方式并不单一,而且在同种分组情况下的运用也不尽相同。其实ORDER BY、GROUP BY和PARTITION BY都有数据分组的作用,大家将在后续章节中体会到这一点。
好了,那么现在就请同学们动手执行一遍上述例句吧,别忘了一边观察结果,一边细细揣摩其中的原理。