《SQL必知必会》笔记(MySQL实现)---结果排序

这篇主要是讲一下如何使用SELECT�语句的ORDER BY子句来对检索的结果进行排序

关于排序首先需要了解到是,当检索出的数据没有被我们指定排序规则的时候,数据一般是以它在底层表中出现的顺序显示。这个顺序可能是数据被添加进数据表的顺序,但是如果数据被更新了或者删除了的话,这个顺序将会受到DBMS重用回收储存空间的方式的影响。因此,如果不明确�指定检索数据的排序规则的话,最终的结果不能也不应该依赖默认的排序规则。关系型数据库设计理论认为,如果不明确排序的规则,则不认为检索出的数据的顺序有任何意义。

为了明确的将SELECT语句检索出的数据排序,可以使用 ORDER BY 子句,我们之前有提到过SQL语句中的子句,但是在这里有必要再说一点,SQL语句中的子句通常由一个关键字加上所提供的数据组成,比如之前用到的FROM子句。在我看来SQL�中的子句的作用就是对SQL语句的操作结果进行一些修饰,以达到想要的效果。

下面进入主题,讲一讲如何使用ORDER BY子句。

按某一列排序

首先来看最基本的按某一列排序,直接看下面的例子:

SELECT prod_name FROM Products ORDER BY prod_name;

结果如下:

按某一列排序.png

可以看到检索的结果已经对prod_name按字母顺序排好序了。
在使用ORDER BY子句时需要注意的是,要保证它是SELECT语句中 最后 一条子句,否则会出现错误。并且,用非检索列(即SELECT没有指出来的列)进行数据排序也是完全合法的。

按多个列排序

很多情况下,需要按不止一个列进行数据排序。当需要按多个列排序的时候,只需要像SELECT选择多个列一样指定多个列名,列名之间用逗号分开即可。看一个简单的例子:

SELECT prod_id, prod_price, prod_name 
FROM Products 
ORDER BY prod_price, prod_name;

结果如下:

按多个列排序.png

结合这个结果可以看出来,当指定了按多个列排序的时候,会按照指定的列的顺序进行排序,比如在这个例子里,首先按照prod_price进行排序,当存在多个prod_price相同的时候对�prod_name排序,否则不会对prod_name排序。

按位置排序

除了能够使用列名为依据进行排序外,ORDER BY还支持按相对列位置进行排序。先看一个例子:

SELECT prod_id, prod_price, prod_name
FROM �Products 
ORDER BY 2, 3;

结果如下;

按位置排序.png

这个例子输出的结果和上个例子的一样,不同之处是在�ORDER BY子句。在这个例子里,ORDER BY子句会根据�指定的相对位置从SELECT选择的所有的列中找到需要的列。比如这个例子中,ORDER BY会选择第二个和第三个列即prod_price和prod_name进行排序,并且会遵循指定的顺序。

使用这个方法进行排序的好处在于不需要重新输入列名,但是其 缺点 也是显而易见的:

  1. 不明确给出列名有可能造成错用列名排序。
  2. 对SELECT清单进行改动时可能会忘记同时修改ORDER BY的顺序,造成错误排序
  3. 如果需要进行排序的列不在SELECT清单中,也会造成错误。

指定排序方向

对数据�排序的默认顺序是 升序 ,即从A到Z,在某些需求下,可能会需要进行 降序 排序,即Z到A,这时�必须制定 DESC(Descending的缩写)关键字。

下面的例子会以价格降序来排序产品,即价格最高的在最上面:

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;

结果如下:

指定排序方向.png

可以很明显的看到�价格越高的产品越在前面。

上面这个例子只是选取了一列进行排序,在实际的使用中,肯定会遇到要用多个列进行排序的情况,这个时候需要注意到是,DESC关键字 只直接应用到直接位于其前面的列名。所以,如果想要在多个列上都进行降序排序的话,�需要每个列都指定DESC关键字,否则没有指定DESC关键字的列会按照默认的升序排序。

�实际上与�DESC相对应的还有 ASC(Ascending的缩写)关键字,使用这个关键字将会指定升序排序,但是实际使用中基本不会用到ASC关键字,因为默认的排序顺序就是升序。

最后还有一个问题需要讨论,那就是对文本性数据进行排序的时候,是否会区分大小写。这个问题并不是理论问题,而取决于数据库的设置方式。在 字典(dictionary)的排序中�,A被视为与a相同,这是大多数DBMS的默认行为。但是许多DBMS允许数据库管理员在需要的时候改变这种行为。例如当数据库里包含了大量的外语字符时,可能会需要这样做。要改变这种顺序,使用ORDER BY是无法做到的,需要向数据库管理员求助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容