mysql排序数据

Posted 曹军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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数据进行排序,然后按列值排序

 

 

 

 

 


以上是关于mysql排序数据的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

Laravel 分页 数据丢失问题解决

Mysql Innodb 表碎片整理

mysql数据库,排序的语句

SQL:按电子邮件域名排序