你不知道的order by

order by我们用过不知多少次了,但真的完全了解它的用法吗?

一。按照列名排序

这是最简单的方法,

select e from e_test order by e;

select e,d from e_test order by e,d;

select e from e_test order by e,d;

这三个语句都可以正常运行.当e相等时,按d排序,而且排序的列并不一定需要出现在select子句中。

二。根据表达式排序

select e from e_test order by substr(e,1,1);取开头的字符排序

order by子句中的表达式甚至可以包含子查询

如:select e from e_test order by abs(e-(select AVG(e) from e_test));

扫描二维码关注公众号,回复: 1357690 查看本文章

甚至可以是关联性子查询

如:select e,d from e_test as p1 order by (select AVG(d) from e_test as p2 where  p1.e=p2.e);

三。使用顺序号码排序

select e,d from e_test order by d;

select e,d from e_test order by 2;

这两个sql语句是相等的,使用顺序号码不是必需的,但简化了一条语句的形式.

select e,sum(d) from e_test order by 2;

select e,d,(select sum(c) from e_test as p1 where p1.e=p2.e) from e_test as p2 order by 3;

在编写order by子句的时候应该尽量地显示化而避免混淆,尽可能使用别名.

如:select e,d,(select sum(c) from e_test as p1 where p1.e=p2.e) as total from e_test as p2 orber by total;此句与前面那句相等,但不容易混淆。

四。按照升序和降序排序

ASC DESC一个升一个降,直接跳过。(注:排序字符值比较复杂,不同的字符集有不同的顺序)

五。对空值排序

mysql把空值当作一列中的最小值对待。

六。按指定排序排序

这一点是我偶然在mysql性能优化一书看到的

create table enum_test e ENUM('fish','apple','dog') NOT NULL;

insert into enum_test(e) values ('fish'),('dog'),('apple');

select e from enum_test order by field(e,'apple','dog','fish');

出来的结果会按照field里的先后顺序排序。


最后提醒一句:注意索引,order by可能导致索引无效。

猜你喜欢

转载自lobert.iteye.com/blog/1654709