mysql排序数据

一:order by的普通使用

1.介绍

  当使用SELECT语句查询表中的数据时,结果集不按任何顺序进行排序。要对结果集进行排序,请使用ORDER BY子句。

  ORDER BY子句允许:

    对单个列或多个列排序结果集。
    按升序或降序对不同列的结果集进行排序。

  使用方式:

    SELECT column1, column2,...

    FROM tbl 

    ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...

  

2.按照列进行排序

SELECT
 contactLastname,
 contactFirstname
FROM
 customers
ORDER BY contactLastname DESC, contactFirstname ASC;

  

  在上面的查询中,ORDER BY子句首先按照contactLastname列降序对结果集进行排序,然后按照contactFirstname列升序对排序结果集进行排序,以生成最终结果集。

 

3.按照表达式进行排序

  ORDER BY子句还允许您根据表达式对结果集进行排序

SELECT
 ordernumber,
 orderlinenumber,
 quantityOrdered * priceEach
FROM orderdetails ORDER BY ordernumber, orderLineNumber, quantityOrdered * priceEach;

  

 

4.order by 与自定义排序

  ORDER BY子句允许使用FIELD()函数为列中的值定义自己的自定义排序顺序。  

  如果要按以下顺序基于以下状态的值对订单进行排序:

    In Process
    On Hold
    Cancelled
    Resolved
    Disputed
    Shipped

   可以使用FIELD()函数将这些值映射到数值列表,并使用数字进行排序; 请参阅以下查询:

SELECT 
    orderNumber, status
FROM
    orders
ORDER BY FIELD(status, 'In Process', 'On Hold', 'Cancelled', 'Resolved', 'Disputed', 'Shipped');

   

  注意的是FIELD函数中又一个status字段。

 

二:order by用自然语言排序

1.新建表

CREATE TABLE IF NOT EXISTS items ( id INT AUTO_INCREMENT PRIMARY KEY, item_no VARCHAR(255) NOT NULL );

  

 

2.插入数据

INSERT INTO items(item_no)
VALUES ('1'), ('1C'), ('10Z'), ('2A'), ('2'), ('3C'), ('20D');

  

 

3.查询结果

  当我们查询选择数据并按item_no排序时,得到以下结果:

SELECT 
    item_no
FROM
    items
ORDER BY item_no;

   

  因为这是自然排序。

 

4.解决方式

  为了克服这个问题,首先我们将item_no列分成两列:prefix 和 suffix。 prefix列存储item_no的数字部分,suffix列存储字母部分。然后根据这些列对数据进行排序。

SELECT 
    item_no
FROM
    items
ORDER BY CAST(item_no AS UNSIGNED) , item_no;

   

  在这个查询中,首先使用类型转换item_no数据转换为无符号整数。 其次,使用ORDER BY子句对数字进行数字排序,然后按字母顺序排列。

 

5.下一个例子

  如果删除表:drop table items

  现在清空表:drop table items

  添加数据:

INSERT INTO items(item_no)
VALUES('A-1'), ('A-2'), ('A-3'), ('A-4'), ('A-5'), ('A-10'), ('A-11'), ('A-20'), ('A-30');

  自然排序:

  

 

6.解决方式

SELECT 
    item_no
FROM
    items
ORDER BY LENGTH(item_no) , item_no;

  

  为了得到上面这个结果,可以使用LENGTH函数。 请注意,LENGTH函数返回字符串的长度。 这个做法是首先对item_no数据进行排序,然后按列值排序

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值