SQL按列位置排序,查询结果更精准

在这里插入图片描述

按列位置排序

除了能用列名指出排序顺序外,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);
  1. 按列位置排序(升序)

    • 按订单总金额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
    
  2. 按列位置排序(降序)

    • 按订单总金额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
    
  3. 按实际列名和相对列位置混合排序

    • 按客户IDcustomer_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
    

非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。

让AI工具成为你的得力助手,感受AI工具的无限可能,让复杂的任务变得简单,让你的工作更加轻松和高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周同学的技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值