MySQL笔记5——对检索出来的数据进行排序(ORDER BY)

本文详细介绍了SQL语句中的ORDER BY子句的使用方法,包括如何对单个或多个列进行升序或降序排序,以及如何结合LIMIT子句获取最高或最低值。

1 ORDER BY

可使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。


首先,输入下面的SQL语句返回某个数据库表的单个列。但请看其输出,并没有特定的顺序。


其实,检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序。

关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义


子句(clause)

SQL语句由子句构成,有些子句是必需的,而有的是可选的。

一个子句通常由一个关键字所提供的数据组成。子句的例子有SELECT语句的FROM子句

P.S. SELECT是关键字,FROM是子句


为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。

ORDER BY子句取一个或多个列的名字,据此对输出进行排序。

输入:

SELECT prod_name FROM products ORDER BY prod_name;


分析:这条语句除了指示MySQL对prod_name列以字母顺序排序数据的ORDER BY子句外,与前面的语句相同。


通过非选择显示的列进行排序

通常,ORDER BY子句中 使用的列 是 将要显示的列。但是,实际上并不一定要这样,用 非检索的列 排序数据是完全合法的。

P.S. 不一定要用将要显示的列来作为,ORDER BY使用来排序的列,可以用非检索的列来排序查询结果


2 按多个列排序

    经常需要按不止一个列进行数据排序。例如,如果要显示雇员清单,可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序)。如果多个雇员具有相同的姓,这样做很有用。

为了按多个列排序,只要指定列名,列名之间用逗号分开即可(就像选择多个列时所做的那样)。


下面的代码检索3个列,并按其中两个列对结果进行排序——首先按价格,然后再按名称排序。

P.S. 先按价格来排序。当价格prod_price出现相同(出现两次及以上)时,才按名称prod_name来排序。如果prod_price的每一列唯一,则prod_name就用不上了。

输入:

SELECT prod_id,prod_price,prod_name 

FROM products 

ORDER BY prod_price,prod_name;



3 指定排序方向——DESC关键字

数据排序不限于升序排序(从A到Z)。这只是默认的排序顺序,还可以使用ORDER BY子句以降序(从Z到A)顺序排序。

为了进行降序排序,必须指定DESC关键字

下面的例子按价格以降序排序产品(最贵的排在最前面)。

输入:

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



但是,如果打算用多个列排序怎么办?下面的例子以降序排序产品(最贵的在最前面),然后再对产品名排序:

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

P.s.:先对价格进行了 降序排序(由贵到便宜)。然后当价格相同时,在进行默认的升序排序(字符从A到Z)。


分析:DESC关键字只应用到直接位于其前面的列名。在上例中,只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序。


在多个列上降序排序

如果想在多个列上进行降序排序必须对每个列指定DESC关键字


与DESC相反的关键字是ASC(ASCENDING),在升序排序时可以指定它。

但实际上,ASC没有多大用处,因为升序是默认的(如果既不指定ASC也不指定DESC,则假定为ASC)。


区分大小写和排序顺序

在对文本性的数据进行排序时,A与a相同吗?a位于B之前还是位于Z之后?

这些问题不是理论问题,其答案取决于数据库如何设置。在字典(dictionary)排序顺序中,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。但是,许多数据库管理员能够在需要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这样做)。这里,关键的问题是,如果确实需要改变这种排序顺序,用简单的ORDER BY子句做不到。你必须请求数据库管理员的帮助


使用ORDER BY和LIMIT的组合,能够找出一个列中最高或最低的值。

下面的例子演示如何找出最昂贵物品的值:

输入:

SELECT prod_price
FROM products
ORDER BY prod_price DESC
LIMIT 1;


分析:prod_price DESC保证行是按照由最昂贵到最便宜检索的,而LIMIT 1告诉MySQL仅返回一行。


ORDER BY子句的位置

在给出ORDER BY子句时,应该保证它位于FROM子句之后。

如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息。

总结

ORDER BY 位于 FROM 之后。

LIMIT 位于 ORDER BY 之后。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值