对检索结果排序

阅读:130

之前讲过检索数据,但是没有特定的顺序,本节将讲解对检索结果进行排序。

1. 排序ORDER BY

1.1 子句(clause)

SQL全部由子句构成,只不过有些子句事必须的,有些是可选的。

那么,子句通常是由关键字和其他数据组成。比如前面讲过的FROM子句。

1.2 ORDER BY 􏰉􏰊子句

为了对检索结果进行排序,我们使用ORDER BY 􏰉􏰊子句完成排序。ORDER BY 􏰉􏰊子句后跟上一个或多个列进行排序。注意,多个列以逗号隔开。

  • 升序,在ORDER BY子句排序字段后加上关键字 ASC(ASCENDING􏱁的缩写),默认就是升序。
  • 降序,在ORDER BY子句排序字段后加上关键字DESC(DESCENDING的缩写)。

我们现在建立一个商品表,在mysql client直接复制执行如下sql:

use d_mall;

DROP TABLE IF EXISTS `t_product`;

CREATE TABLE `t_product` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `pro_name` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `pro_price` decimal(10,2) DEFAULT NULL COMMENT '商品售价',
  `pro_sku` int(11) DEFAULT NULL COMMENT '商品sku',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

BEGIN;
INSERT INTO `t_product` VALUES (1, 'Apple phone 12', 12000.00, 2);
INSERT INTO `t_product` VALUES (2, 'HUAWEI Mate40', 9800.00, 1);
INSERT INTO `t_product` VALUES (4, 'XiaoMi 10', 4800.00, 3);
INSERT INTO `t_product` VALUES (5, 'OPPO Reno4', 3900.00, 5);
INSERT INTO `t_product` VALUES (6, 'HUAWEI P40', 5600.00, 1);
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

我们建立了四个字段,分别是:

  • id,商品编号,主键
  • pro_name,商品名称
  • pro_price,商品售价
  • pro_sku,商品sku,可以简单理解为商品的分类id

 

2. 对单个列进行排序

我们现在对商品的价格从小到大排列,也就是升序。执行如下SQL:

SELECT id, pro_name, pro_price, pro_sku FROM t_product ORDER BY pro_price ASC;

输出结果:

+----+----------------+-----------+---------+
| id | pro_name       | pro_price | pro_sku |
+----+----------------+-----------+---------+
|  5 | OPPO Reno4     |   3900.00 |       5 |
|  4 | XiaoMi 10      |   4800.00 |       3 |
|  6 | HUAWEI P40     |   5600.00 |       1 |
|  2 | HUAWEI Mate40  |   9800.00 |       1 |
|  1 | Apple phone 12 |  12000.00 |       2 |
+----+----------------+-----------+---------+

结果符合我们预期,输出顺序按照商品价格pro_price输出。注意,这里ASC可以省略。

现在我们需要对商品价格倒叙排列,执行以下SQL并输出:

mysql> SELECT id, pro_name, pro_price, pro_sku FROM t_product ORDER BY pro_price DESC;
+----+----------------+-----------+---------+
| id | pro_name       | pro_price | pro_sku |
+----+----------------+-----------+---------+
|  1 | Apple phone 12 |  12000.00 |       2 |
|  2 | HUAWEI Mate40  |   9800.00 |       1 |
|  6 | HUAWEI P40     |   5600.00 |       1 |
|  4 | XiaoMi 10      |   4800.00 |       3 |
|  5 | OPPO Reno4     |   3900.00 |       5 |
+----+----------------+-----------+---------+
5 rows in set (0.01 sec)

由于我们指定DESC,结果按照倒叙排列。

注意:

  • ORDER BY 子句应该是SELECT最后一条子句,否则会报错。
  • 排序列可以不出现SELECT后的现实出来的列。

3. 对多个列进行排序

很多时候,我们需要对多个列进行排序。我们只需要再ORDER BY后指定多个列名,然后用逗号隔开即可,和之前的选择现实的列一样。

现在,我们先按照价格进行排序,然后对商品的名称排序,执行以下SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product ORDER BY pro_price, pro_name;
+----+-----------+----------------+
| id | pro_price | pro_name       |
+----+-----------+----------------+
|  5 |   3900.00 | OPPO Reno4     |
|  4 |   4800.00 | XiaoMi 10      |
|  6 |   5600.00 | HUAWEI P40     |
|  2 |   9800.00 | HUAWEI Mate40  |
|  1 |  12000.00 | Apple phone 12 |
+----+-----------+----------------+
5 rows in set (0.00 sec)

以上,是对商品价格和商品名字进行排序。对多个列排序,先按照前面的列排序,如果前面的列相同,再按照后面的列进行排序,以此类推。此处,先按照价格排序,当价格相同,再按照名字进行商品名称排序。

现在,我们还有一个需求,就是按照价格降序排列,商品名称升序排列,SQL如下:

现在,我们先按照价格进行排序,然后对商品的名称排序,执行以下SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product ORDER BY pro_price DESC, pro_name;
+----+-----------+----------------+
| id | pro_price | pro_name       |
+----+-----------+----------------+
|  1 |  12000.00 | Apple phone 12 |
|  2 |   9800.00 | HUAWEI Mate40  |
|  6 |   5600.00 | HUAWEI P40     |
|  4 |   4800.00 | XiaoMi 10      |
|  5 |   3900.00 | OPPO Reno4     |
+----+-----------+----------------+
5 rows in set (0.00 sec)

注意:对多个排序列,排序方式不同,在排序列后加上DESC或ASC。

对多个列进行排序,还有一种写法,如下SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product ORDER BY 2, 3;
+----+-----------+----------------+
| id | pro_price | pro_name       |
+----+-----------+----------------+
|  5 |   3900.00 | OPPO Reno4     |
|  4 |   4800.00 | XiaoMi 10      |
|  6 |   5600.00 | HUAWEI P40     |
|  2 |   9800.00 | HUAWEI Mate40  |
|  1 |  12000.00 | Apple phone 12 |
+----+-----------+----------------+
5 rows in set (0.00 sec)

这里SQL的意思是,先按照SELECT后的选择列第二个列排序,也就是pro_price。然后再按照SELECT后的选择列第三个列排序,也就是pro_name排序。

这种叫做相对列方式排序。注意,可以和实际列排序混用。

这种写法虽然简洁,但是有缺陷。比如排序字段没有出现在SELECT后的选择列,就无法使用次方式。

总结:

  1. 对列进行排序使用ORDER BY子句,一般在SELECT最后,不然会报错。
  2. 对多个列排序,ORDER BY后加多个排序列即可,以逗号隔开。如果排序列方向不同,在排序列后加上DESC或ASC。
  3. 对多个列排序,可以使用指定具体的列排序和相对列排序,也可以混用。

 


读后有收获,请作者喝杯咖啡

全部评论

发表评论
更多精彩内容,请关注微信公众号