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数据进行排序,然后按列值排序


原文地址:https://www.cnblogs.com/juncaoit/p/7820085.html