排序检索数据
本章将讲授如何使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。
排序数据
还是使用上一节中的例子,查询employees表中的last_name字段
SELECT last_name
FROM `employees`;
输出结果:
发现其输出并没有特定的顺序。其实,检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有
意义。
子句(clause): SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。我们使用过的SELECT语句的FROM语句都是子句。本次介绍的ORDER BY子句是一个可选子句。
为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。请看下面的例子:
【示例】对employees表中的last_name字段查询结果进行排序
SELECT last_name
FROM `employees`
ORDER BY last_name;
运行结果按照字典顺序排序:
按多个列排序
经常会有这样的需求,按照姓先排序,如果姓重复了,再按照名排序。ORDER BY子句后面可以接多个字段,其顺序就是排序的先后顺序
【示例】查询employees表中所有信息,先按照last_name排序,再对first_name排序
SELECT *
FROM `employees`
ORDER BY last_name, first_name;
运行结果:
排序方向
数据排序不限于升序排序(从A到Z)。这只是默认的排序顺序,还可以使用ORDER BY子句以降序(从Z到A)顺序排序。为了进行降序排序,必须指定DESC关键字。
【示例】查询employees表中的last_name字段,使用降序排序
SELECT last_name
FROM `employees`
ORDER BY last_name DESC;
运行结果:
如果对多个字段进行排序,每个字段后面都可以加上限制排序方向的关键字,如
SELECT *
FROM `employees`
ORDER BY last_name DESC, first_name;
上述表示先对last_name字段进行降序, 然后再对firtst_name进行升序。
与DESC相反的关键字是ASC(ASCENDING),在升序排序时可以指定它。但实际上,ASC没有多大用处,因为升序是默认的(上面例子中,既不指定ASC也不指定DESC,则假定为ASC)。
在字典(dictionary)排序顺序中,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。但是,许多数据库管理员能够在需要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这样做)。