目录
第五章:排序检索数据
如何使用select语句的order、by子句,根据需要排序检索出的数据;
5.1:排序数据
没有特定的顺序,且仅返回某个数据库表的单个列。
select prod_name from products;
关于检索出来的数据并不是存粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。可以是数据最初添加到表中的顺序。如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。
关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义;
句子(clause):
- SQL语句由子构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。
Order by 子句:取一个或多个列的名字,据此对输出进行排序;
select prod_name from products order by prod_name;
这条语句除了指示MySQL对prod_name列以字母顺序排序数据的order by子句外,与前面的语句相同;
通过非选择列进行排序:
- order by子句中使用的列将是为显示所选的列。但是实际上并不一定要这样,用非检索的列排序数据是完全合法的。
5.2 :按多个列排序
为了按多个列排序,只要指定列名,列名之间用逗号分开即可。
- 例子:下面代码检索3个列,并按其中两个列对结果进行排序,首先按价格,然后再按名称排序;
select prod_id, prod_price, prod_name from products
order by prod_price, prod_name;
注意:在按多个列排序时,排序完全按所规定的顺序进行。上述例子输出中,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。换句话说,如果prod_price列中所有的值都是唯一的,那么则不回按prod_name排序;
5.3 : 指定排序方向
数据排序可从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 ;
注意:
- desc关键字智能应用到直接位于其前面的列名;因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的生序排序;
在多个列上降序排序:
- 如果想在多个列进行降序排序,必须对每个列指定desc关键字;
ASC :
- 与desc相反的关键字是ASC (ascending),在生序排序时可以指定它。
(生序是默认的,所以asc没有多大用处)
区分大小写和排序顺序:
- 在字典(dictionary)排序顺序中,A被视为与a相同(默认的行为),必要时候如果数据库包含大量外语字符,可能必须要改变这种默认的行为;改变此行为,必须请求数据库管理员帮助;
使用order by 和limit组合,找出一个列中最高或最低的值:
- 例子:演示如何找出最昂贵物品的值;
select prod_price from products
order by prod_price desc
limit 1;
prod_price desc 保证行是按照以降序排列,即最贵的到最便宜的。而limit 1则返回第一行;
order by 子句位置:
- order by子句,应该保证位于from子句后。 而limit ,它必须位于order by之后。