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));
甚至可以是关联性子查询
如: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可能导致索引无效。