暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

周同学带您玩AI 2024-08-08
172

按列位置排序

除了能用列名指出排序顺序外,ORDER BY
还支持按相对列位置进行排序。为理解这一内容,来看一个例子:

输入

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 23;

输出

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(102)
);

INSERT INTO Orders (order_id, customer_id, order_date, total_amount) VALUES
(1101'2024-01-10'250.00),
(2102'2024-02-15'150.00),
(3101'2024-03-10'300.00),
(4103'2024-01-25'400.00),
(5102'2024-02-20'200.00);

  1. 按列位置排序(升序)

    SELECT order_id, customer_id, order_date, total_amount
    FROM Orders
    ORDER BY 43;

    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
      升序排序:
  2. 按列位置排序(降序)

    SELECT order_id, customer_id, order_date, total_amount
    FROM Orders
    ORDER BY 4 DESC3 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

    • 按订单总金额total_amount
      降序排序,再按订单日期order_date
      降序排序:
  3. 按实际列名和相对列位置混合排序

    SELECT order_id, customer_id, order_date, total_amount
    FROM Orders
    ORDER BY customer_id ASC4 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

    • 按客户IDcustomer_id
      升序排序,再按订单总金额total_amount
      降序排序:

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

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


文章转载自周同学带您玩AI,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论