排序检索数据
睡不醒的鲤鱼 2021-12-22 MySQL SQL 必知必会
本文讲解如何使用 SELECT 语句的 ORDER BY 子句,根据需要排序检索出的数据。
# 一、排序数据
SELECT prod_name
FROM Products
ORDER BY prod_name;
1
2
3
2
3
注意
在指定一条 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一条子句。
# 二、按多个列排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
1
2
3
2
3
# 三、按列位置排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
1
2
3
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
2
3
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
1
2
3
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
2
3
4
5
6
解答
SELECT cust_name
FROM Customers
ORDER BY cust_name DESC;
1
2
3
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
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
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
2
3
4
5
6
7
8
解答
SELECT quantity, item_price
FROM OrderItems
ORDER BY quantity DESC, item_price DESC;
1
2
3
2
3
# 6.4 检查 SQL 语句
描述
有 Vendors 表
vend_name |
---|
海底捞 |
小龙坎 |
大龙燚 |
问题
下面的 SQL 语句有问题吗?尝试将它改正确,使之能够正确运行,并且返回结果根据 vend_name 逆序排列。
SELECT vend_name,
FROM Vendors
ORDER vend_name DESC;
1
2
3
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
2
3
4
5
6
7
解答
SELECT vend_name
FROM Vendors
ORDER BY vend_name DESC;
1
2
3
2
3