按列位置排序
除了能用列名指出排序顺序外,ORDER BY
还支持按相对列位置进行排序。为理解这一内容,来看一个例子:
输入
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
输出
prod_id | prod_price | prod_name
--------|------------|-----------
BNBG02 | 3.4900 | Bird bean bag toy
BNBG01 | 3.4900 | Fish bean bag toy
BNBG03 | 3.4900 | Rabbit bean bag toy
RGAN01 | 4.9900 | Raggedy Ann
BRO1 | 5.9900 | 8 inch teddy bear
BRO2 | 8.9900 | 12 inch teddy bear
RYL01 | 9.4900 | King doll
RYL02 | 9.4900 | Queen doll
BR03 | 11.9900 | 18 inch teddy bear
分析
可以看到,这里的输出与上面的查询相同,不同之处在于ORDER BY
子句。SELECT
清单中指定的是选择列的相对位置而不是列名。ORDER BY 2
表示按SELECT
清单中的第二个列prod_price
进行排序。ORDER BY 2, 3
表示先按prod_price
,再按prod_name
进行排序。
这项技术的主要好处在于不用重新输入列名。但它也有缺点。首先,不明确给出列名有可能造成误用列名排序。其次,在对SELECT
清单进行更改时容易错误地对数据进行排序(忘记对ORDER BY
子句做相应的改动)。最后,如果进行排序的列不在SELECT
清单中,显然不能使用这项技术。
提示:按非选择列排序
显然,当根据不出现在SELECT
清单中的列进行排序时,不能采用这项技术。但是,如果有必要,可以混合使用实际列名和相对列位置。
详细举例
订单信息的表Orders
,表结构和数据如下:
CREATE TABLE Orders (
order_id INT,
customer_id INT,
order_date DATE,
total_amount DECIMAL(10, 2)
);
INSERT INTO Orders (order_id, customer_id, order_date, total_amount) VALUES
(1, 101, '2024-01-10', 250.00),
(2, 102, '2024-02-15', 150.00),
(3, 101, '2024-03-10', 300.00),
(4, 103, '2024-01-25', 400.00),
(5, 102, '2024-02-20', 200.00);
-
按列位置排序(升序):
- 按订单总金额
total_amount
升序排序,再按订单日期order_date
升序排序:
SELECT order_id, customer_id, order_date, total_amount FROM Orders ORDER BY 4, 3;
order_id | customer_id | order_date | total_amount ---------|--------------|------------|------------- 2 | 102 | 2024-02-15 | 150.00 5 | 102 | 2024-02-20 | 200.00 1 | 101 | 2024-01-10 | 250.00 3 | 101 | 2024-03-10 | 300.00 4 | 103 | 2024-01-25 | 400.00
- 按订单总金额
-
按列位置排序(降序):
- 按订单总金额
total_amount
降序排序,再按订单日期order_date
降序排序:
SELECT order_id, customer_id, order_date, total_amount FROM Orders ORDER BY 4 DESC, 3 DESC;
order_id | customer_id | order_date | total_amount ---------|--------------|------------|------------- 4 | 103 | 2024-01-25 | 400.00 3 | 101 | 2024-03-10 | 300.00 1 | 101 | 2024-01-10 | 250.00 5 | 102 | 2024-02-20 | 200.00 2 | 102 | 2024-02-15 | 150.00
- 按订单总金额
-
按实际列名和相对列位置混合排序:
- 按客户ID
customer_id
升序排序,再按订单总金额total_amount
降序排序:
SELECT order_id, customer_id, order_date, total_amount FROM Orders ORDER BY customer_id ASC, 4 DESC;
order_id | customer_id | order_date | total_amount ---------|--------------|------------|------------- 1 | 101 | 2024-01-10 | 250.00 3 | 101 | 2024-03-10 | 300.00 5 | 102 | 2024-02-20 | 200.00 2 | 102 | 2024-02-15 | 150.00 4 | 103 | 2024-01-25 | 400.00
- 按客户ID
非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。
让AI工具成为你的得力助手,感受AI工具的无限可能,让复杂的任务变得简单,让你的工作更加轻松和高效。