mysql> select * from user order by age;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 5 | 六麻子 | 13 | 0 |
| 1 | 李子捌 | 18 | 1 |
| 7 | 谢礼 | 18 | 1 |
| 2 | 张三 | 22 | 1 |
| 4 | 王五 | 25 | 1 |
| 6 | 田七 | 37 | 1 |
| 3 | 李四 | 38 | 1 |
+----+--------+-----+-----+
7 rows in set (0.00 sec)
分析:
可以看到user表输出顺序按照age升序排序输出,因此可以猜测mysql默认的排序方式是升序。此外我这里使用*通配符查询所有列,并未明确指明查询age列;其实mysql的order by后跟的列不一定要查询出来,比如 select name from user order by age;这样也是一样的效果。
2.2 多个列排序
order by不仅可以对单个列进行排序,它也可以对多个列进行排序,只需要把需要排序的列依次跟在order by之后就可以了。
在测试之前,我们先往表中添加一条年龄相等的数据
mysql> insert into user (name, age, sex) values ('李子柒', 18, 1);
query ok, 1 row affected (0.01 sec)
需求:
根据用户年龄升序排序之后再更加用户名称排序。
语句:
select * from user order by age, name;
结果:
mysql> select * from user order by age, name;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 5 | 六麻子 | 13 | 0 |
| 1 | 李子捌 | 18 | 1 |
| 8 | 李子柒 | 18 | 1 |
| 7 | 谢礼 | 18 | 1 |
| 2 | 张三 | 22 | 1 |
| 4 | 王五 | 25 | 1 |
| 6 | 田七 | 37 | 1 |
| 3 | 李四 | 38 | 1 |
+----+--------+-----+-----+
8 rows in set (0.00 sec)
分析:
order by可以作用于多个列,mysql会完全根据order by后列的顺序进行排序。不过mysql对于中文的排序需要考虑数据库字符集编码的问题,如果不是很懂建议不要对中文进行排序,因为大多数情况我们需要得到的是拼音的排序结果,但是往往不尽人意哦!此外这里我们在age和name后都是没有跟排序方式的,所以默认都是升序,先根据age升序排序之后再根据name升序排序。如果需要使用降序,则需要指明desc,比如 select id, name, age from user order by age, name desc; 。
2.3 排序的方式 order by有两种排序方式,它们分别是:
asc -> 升序排序(默认排序方式)
desc -> 降序排序
mysql> select * from user order by age desc, name;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 3 | 李四 | 38 | 1 |
| 6 | 田七 | 37 | 1 |
| 4 | 王五 | 25 | 1 |
| 2 | 张三 | 22 | 1 |
| 1 | 李子捌 | 18 | 1 |
| 8 | 李子柒 | 18 | 1 |
| 7 | 谢礼 | 18 | 1 |
| 5 | 六麻子 | 13 | 0 |
+----+--------+-----+-----+
8 rows in set (0.00 sec)
可以看到李子捌、李子柒、谢礼三行数据排序方式发生了改变。
2.4 order by结合limit
order by结合limit可以获取排序后的数据行记录数量。比如我们从user表中获取年龄最大的一个用户。可以看到李四同志38岁了,比较老了,属于年龄最大的人之一。
mysql> select * from user order by age desc limit 1;
+----+------+-----+-----+
| id | name | age | sex |
+----+------+-----+-----+
| 3 | 李四 | 38 | 1 |
+----+------+-----+-----+
1 row in set (0.00 sec)
limit需要跟在order by之后,如果位置不对,mysql会抛出异常信息。
mysql> select * from user limit 1 order by age des;
error 1064 (42000): you have an error in your sql syntax; check the manual that corresponds to your mysql server version for the right syntax to use near 'order by age des' at line 1