MySQL ORDER BY子句的用法(非常详细)
从前面的查询结果中可以发现,有些字段的值是没有任何顺序的,MySQL 可以通过在 SELECT 语句中使用 ORDER BY 子句对查询的结果进行排序。
为了方便演示 ORDER BY 的用法,需要往数据表插入如下数据:
下面使用 ORDER BY 子句对指定的列数据进行排序。
【实例 1】查询表 fruits 中的 f_name 字段,并对其进行排序,SQL 语句如下:
对多列数据进行排序时,要将需要排序的列用逗号隔开。
【实例 2】查询表 fruits 中的 f_name 和 f_price 字段,先按 f_name 排序,再按 f_price 排序,SQL 语句如下:
【实例 3】查询表 fruits 中的 f_name 和 f_price 字段,对结果按 f_price 降序排序,SQL 语句如下:
也可以对多列进行不同的顺序排序,如下面的实例所示。
【实例 4】查询表 fruits,先按 f_price 降序排列,再按 f_name 升序排列,SQL 语句如下:
为了方便演示 ORDER BY 的用法,需要往数据表插入如下数据:
mysql> INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES('a1', 101,'apple',5.2), ('b1',101,'blackberry', 10.2), ('bs1',102,'orange', 11.2), ('bs2',105,'melon',8.2), ('t1',102,'banana', 10.3), ('t2',102,'grape', 5.3), ('o2',103,'coconut', 9.2), ('c0',101,'cherry', 3.2), ('a2',103, 'apricot',2.2), ('l2',104,'lemon', 6.4), ('b2',104,'berry', 7.6), ('m1',106,'mango', 15.7), ('m2',105,'xbabay', 2.6), ('t4',107,'xbababa', 3.6), ('m3',105,'xxtt', 11.6), ('b5',107,'xxxx', 3.6);
MySQL ORDER BY单列排序
例如,查询 f_name 字段,查询结果如下:mysql> SELECT f_name FROM fruits; +------------+ | f_name | +------------+ | apple | | apricot | | blackberry | | berry | | xxxx | | orange | | melon | | cherry | | lemon | | mango | | xbabay | | xxtt | | coconut | | banana | | grape | | xbababa | +------------+可以看到,查询的数据并没有以一种特定的顺序显示。如果没有对查询结果进行排序,就将根据它们插入数据表中的顺序来显示。
下面使用 ORDER BY 子句对指定的列数据进行排序。
【实例 1】查询表 fruits 中的 f_name 字段,并对其进行排序,SQL 语句如下:
mysql> SELECT f_name FROM fruits ORDER BY f_name; +------------+ | f_name | +------------+ | apple | | apricot | | banana | | berry | | blackberry | | cherry | | coconut | | grape | | lemon | | mango | | melon | | orange | | xbababa | | xbabay | | xxtt | | xxxx | +------------+该语句查询的结果和前面的相同,不同的是,通过指定 ORDER BY 子句,MySQL 对 name 列的数据按字母表的顺序进行了升序排列。
MySQL ORDER BY多列排序
有时,需要根据多列值进行排序。比如,如果要显示一个学生列表,可能会有多个学生的姓氏是相同的,因此还需要根据学生的名进行排序。对多列数据进行排序时,要将需要排序的列用逗号隔开。
【实例 2】查询表 fruits 中的 f_name 和 f_price 字段,先按 f_name 排序,再按 f_price 排序,SQL 语句如下:
SELECT f_name, f_price FROM fruits ORDER BY f_name, f_price;查询结果如下:
+------------+---------+ | f_name | f_price | +------------+---------+ | apple | 5.20 | | apricot | 2.20 | | banana | 10.30 | | berry | 7.60 | | blackberry | 10.20 | | cherry | 3.20 | | coconut | 9.20 | | grape | 5.30 | | lemon | 6.40 | | mango | 15.70 | | melon | 8.20 | | orange | 11.20 | | xibababa | 3.60 | | xbabay | 2.60 | | xxtt | 11.60 | | xxxxx | 3.60 | +------------+---------+在对多列进行排序的时候,排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
MySQL ORDER BY指定排序方向
默认情况下,查询数据按字母升序进行排序(A~Z),但数据的排序并不仅限于此,还可以使用 ORDER BY 对查询结果进行降序排序(Z~A)。这可以通过关键字 DESC 实现。【实例 3】查询表 fruits 中的 f_name 和 f_price 字段,对结果按 f_price 降序排序,SQL 语句如下:
SELECT f_name, f_price FROM fruits ORDER BY f_price DESC;查询结果如下:
+------------+---------+ | f_name | f_price | +------------+---------+ | mango | 15.70 | | xxtt | 11.60 | | orange | 11.20 | | banana | 10.30 | | blackberry | 10.20 | | coconut | 9.20 | | melon | 8.20 | | berry | 7.60 | | lemon | 6.40 | | grape | 5.30 | | apple | 5.20 | | xxxxx | 3.60 | | xibababa | 3.60 | | cherry | 3.20 | | xbabay | 2.60 | | apricot | 2.20 | +------------+---------+与 DESC 相反的是 ASC(升序),它将字段列中的数据按字母表顺序升序排列。实际上,在排序的时候 ASC 是默认的排序方式,所以加不加 ASC 关键字都可以。
也可以对多列进行不同的顺序排序,如下面的实例所示。
【实例 4】查询表 fruits,先按 f_price 降序排列,再按 f_name 升序排列,SQL 语句如下:
SELECT f_price, f_name FROM fruits ORDER BY f_price DESC, f_name;查询结果如下:
+---------+------------+ | f_price | f_name | +---------+------------+ | 15.70 | mango | | 11.60 | xxtt | | 11.20 | orange | | 10.30 | banana | | 10.20 | blackberry | | 9.20 | coconut | | 8.20 | melon | | 7.60 | berry | | 6.40 | lemon | | 5.30 | grape | | 5.20 | apple | | 3.60 | xbababa | | 3.60 | xxxxx | | 3.20 | cherry | | 2.60 | xbabay | | 2.20 | apricot | +---------+------------+DESC 关键字只对其前面的列进行降序排列,在这里只对 f_price 排序,而并没有对 f_name 进行排序。因此,f_price 按降序排列,而 f_name 仍按升序排列。如果要对多列都进行降序排列,则必须在每一列的列名后面加 DESC 关键字。