MySQL ORDER BY

时间:2019-11-20 08:52:03  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL ORDER BY子句对结果集进行排序。

MySQL ORDER BY子句简介

当您使用SELECT语句从表中查询数据时,结果集不会排序。
这意味着结果集中的行可以按任何顺序排列。

要对结果集进行排序,可以将ORDER BY子句添加到SELECT语句中。
以下说明了ORDER BY子句的语法:

SELECT 
   select_list
FROM 
   table_name
ORDER BY 
   column1 [ASC|DESC], 
   column2 [ASC|DESC],
   ...;

使用这种语法,您可以在ORDER BY子句后指定要排序的一列或多列。

ASC代表升序,DESC代表降序。
您使用ASC对结果集进行升序排序,并使用DESC对结果集进行降序排序。

此ORDER BY子句按升序对结果集排序:

ORDER BY column1 ASC;

并且此ORDER BY子句以降序对结果集进行排序:

ORDER BY column1 DESC;

默认情况下,如果您未明确指定任何选项,则ORDER BY子句将使用ASC。

因此,以下子句是等效的:

ORDER BY column1 ASC;

ORDER BY column1;

如果要按多列对结果集进行排序,则可以在ORDER BY子句中指定以逗号分隔的列列表:

ORDER BY
   column1,
   column2;

可以对结果进行升序排列,然后再对另一列进行降序排列:

ORDER BY
    column1 ASC,
    column2 DESC;

在这种情况下,ORDER BY子句:

  • 首先,将结果集按column1中的值按升序排序。

  • 然后,按column2中的值以降序对排序的结果集进行排序。
    请注意,在此步骤中,column1中值的顺序不会改变,仅column2中值的顺序会改变。

注意,ORDER BY子句总是在FROM和SELECT子句之后求值。

MySQL ORDER BY示例

我们将使用示例数据库中的客户表进行演示。

A)使用MySQL ORDER BY子句对一列示例中的值进行排序

以下查询使用ORDER BY子句按contactLastName列中的值以升序对客户进行排序。

SELECT
	contactLastname,
	contactFirstname
FROM
	customers
ORDER BY
	contactLastname;

如果要按姓氏降序对客户进行排序,请在ORDER BY子句的contactLastname列之后使用DESC,如以下查询所示:

SELECT
	contactLastname,
	contactFirstname
FROM
	customers
ORDER BY
	contactLastname DESC;

B)使用MySQL ORDER BY子句对多列示例中的值进行排序

如果要按姓氏降序对客户排序,然后按姓氏升序对客户排序,请在相应列中同时指定DESC和ASC,如下所示:

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

在此示例中,ORDER BY子句按姓氏先对降序的结果集进行降序排序,然后按名字对升序对排序的结果集进行升序排序以生成最终结果集。

C)使用MySQL ORDER BY通过表达式示例对结果集进行排序

请参阅示例数据库中的以下orderdetails表。

以下查询从orderdetails表中选择订单行项目。
它计算每个订单项的小计,并根据小计对结果集进行排序。

SELECT 
    orderNumber, 
    orderlinenumber, 
    quantityOrdered * priceEach
FROM
    orderdetails
ORDER BY 
   quantityOrdered * priceEach DESC;

为了使查询更具可读性,可以在SELECT子句中为表达式分配一个列别名,并在ORDER BY子句中使用该列别名,如以下查询所示:

SELECT 
    orderNumber,
    orderLineNumber,
    quantityOrdered * priceEach AS subtotal
FROM
    orderdetails
ORDER BY subtotal DESC;

在此示例中,我们使用小计作为表达式quantityOrdered * priceEach的列别名,并按小计别名对结果集进行排序。

可以在ORDER BY子句中使用列别名,因为SELECT子句在ORDER BY子句之前进行求值。
在评估ORDER BY子句时,可以访问列别名。

使用MySQL ORDER BY使用自定义列表对数据进行排序

ORDER BY子句允许您通过使用FIELD()函数使用自定义列表对数据进行排序。

请参阅示例数据库中的以下订单表。

假设您要根据以下订单中的状态对销售订单进行排序:

  • 进行中
  • 等候接听
  • 取消
  • 解决
  • 争议
  • 已出货

为此,可以使用FIELD()函数将每个订单状态映射到一个数字,并根据FIELD()函数的结果对结果进行排序:

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

下面的表达式:

FIELD(status, 'In Process', 'On Hold', 'Cancelled', 'Resolved', 'Disputed', 'Shipped');

返回"处理中","保留","已取消","已解决","有争议","已发货"列表中状态的索引。

例如,如果状态为处理中,则函数将返回1。
如果状态为保留,则函数将返回2,依此类推。

在本教程中,您学习了如何使用MySQL ORDER BY子句按一个或多个列以升序或降序对结果集中的行进行排序。