排序检索数据

2021-12-22 MySQL SQL 必知必会

本文讲解如何使用 SELECT 语句的 ORDER BY 子句,根据需要排序检索出的数据。

# 一、排序数据

SELECT prod_name
FROM Products
ORDER BY prod_name;
1
2
3

注意

在指定一条 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一条子句。

# 二、按多个列排序

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
1
2
3

# 三、按列位置排序

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
1
2
3

语句中的 ORDER BY 2, 3 表示先按 prod_price,再按 prod_name 进行排序。

# 四、指定排序方向

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
1
2
3
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
1
2
3

# 五、小结

本文讲解了如何用 SELECT 语句的 ORDER BY 子句对检索出的数据进行排序。

这个子句必须是 SELECT 语句中的最后一条子句。根据需要,可以利用它在一个或多个列上对数据进行排序。

# 六、挑战题

# 6.1 检索顾客名称并且排序

描述

有表 Customers,cust_id 代表客户 id,cust_name 代表客户姓名。

cust_id cust_name
a1 andy
a2 ben
a3 tony
a4 tom
a5 an
a6 lee
a7 hex

问题

从 Customers 中检索所有的顾客名称(cust_name),并按从 Z 到 A 的顺序显示结果。

示例

DROP TABLE IF EXISTS `Customers`;
CREATE TABLE IF NOT EXISTS `Customers`(
	cust_id VARCHAR(255) NOT NULL COMMENT '客户id',
	cust_name VARCHAR(255) NOT NULL COMMENT '客户姓名'
);
INSERT `Customers` VALUES ('a1','andy'),('a2','ben'),('a3','tony'),('a4','tom'),('a5','an'),('a6','lee'),('a7','hex');
1
2
3
4
5
6

解答

SELECT cust_name
FROM Customers
ORDER BY cust_name DESC;
1
2
3

# 6.2 对顾客 ID 和日期排序

描述

有 Orders 表

cust_id order_num order_date
andy aaaa 2021-01-01 00:00:00
andy bbbb 2021-01-01 12:00:00
bob cccc 2021-01-10 12:00:00
dick dddd 2021-01-11 00:00:00

问题

编写 SQL 语句,从 Orders 表中检索顾客 ID(cust_id)和订单号(order_num),并先按顾客 ID 对结果进行排序,再按订单日期倒序排列。

示例

DROP TABLE IF EXISTS `Orders`;
CREATE TABLE IF NOT EXISTS `Orders` (
  `cust_id` varchar(255) NOT NULL COMMENT '顾客 ID',
  `order_num` varchar(255) NOT NULL COMMENT '订单号',
  `order_date` timestamp NOT NULL COMMENT '订单时间'
);
INSERT INTO `Orders` VALUES ('andy','aaaa','2021-01-01 00:00:00'),
('andy','bbbb','2021-01-01 12:00:00'),
('bob','cccc','2021-01-10 12:00:00'),
('dick','dddd','2021-01-11 00:00:00');
1
2
3
4
5
6
7
8
9
10

解答

SELECT cust_id, order_num
FROM Orders
ORDER BY cust_id, order_date DESC;
1
2
3

# 6.3 按照数量和价格排序

描述

假设有一个 OrderItems 表

quantity item_price
1 100
10 1003
2 500

问题

编写 SQL 语句,显示 OrderItems 表中的数量(quantity)和价格(item_price),并按数量由多到少、价格由高到低排序。

示例

DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems` (
  `quantity` INT(64) NOT NULL COMMENT '数量',
  `item_price` INT(64) NOT NULL COMMENT '订单价格'
);
INSERT INTO `OrderItems` VALUES (1,100),
(10,1003),
(2,500);
1
2
3
4
5
6
7
8

解答

SELECT quantity, item_price
FROM OrderItems
ORDER BY quantity DESC, item_price DESC;
1
2
3

# 6.4 检查 SQL 语句

描述

有 Vendors 表

vend_name
海底捞
小龙坎
大龙燚

问题

下面的 SQL 语句有问题吗?尝试将它改正确,使之能够正确运行,并且返回结果根据 vend_name 逆序排列。

SELECT vend_name, 
FROM Vendors 
ORDER vend_name DESC;
1
2
3

示例

DROP TABLE IF EXISTS `Vendors`;
CREATE TABLE IF NOT EXISTS `Vendors` (
  `vend_name` VARCHAR(255) NOT NULL COMMENT 'vend名称'
);
INSERT INTO `Vendors` VALUES ('海底捞'),
('小龙坎'),
('大龙燚');
1
2
3
4
5
6
7

解答

SELECT vend_name
FROM Vendors 
ORDER BY vend_name DESC;
1
2
3

# 七、参考资料

Last Updated: 2023-01-28 4:31:25