Skip to main content

MySQL订购人

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子句按升序对第1列中的值设置的结果进行排序:

ORDER BY column1 ASC;

这个ORDER BY子句按降序排列第1列中的值所设置的结果:

ORDER BY column1 DESC;

默认情况下,如果未明确指定任何选项,ORDER By子句将使用ASC。因此,以下按顺序排列的条款是等效的:

ORDER BY column1 ASC;

ORDER BY column1;

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

ORDER BY
column1,
column2;

在本例中,ORDER BY子句首先按列1升序排列结果集,然后按列2升序排列排序结果集。

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

ORDER BY
column1 ASC,
column2 DESC;

在这种情况下,ORDER BY条款:

当使用ORDER BY子句执行SELECT语句时,MySQL总是在FROM和SELECT子句之后计算ORDER BY子句:

MySQL按示例排序

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

A) 使用MySQL ORDER BY子句按一列对结果集进行排序示例

下面的查询使用ORDER BY子句按姓氏升序对客户进行排序。

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表。

order_details_table

以下查询从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;

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

由于MySQL在ORDER BY子句之前计算SELECT子句,因此可以在ORDER BY子句中使用SELECT子句中指定的列别名。

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

FIELD()函数具有以下语法:

FIELD(str, str1, str2, ...)

函数的作用是:返回str1、str2……列表中str的位置。如果str不在列表中,则FIELD()函数返回0。例如,以下查询返回1,因为字符串“A”的位置是列表“A”、“B”和“C”上的第一个位置:

SELECT FIELD('A', 'A', 'B','C');

输出:

下面的示例返回2:

SELECT FIELD('B', 'A','B','C');

输出:

让我们举一个更实际的例子。

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

orders table

假设您希望根据销售订单的状态按以下顺序对其进行排序:

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

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

MySQL ORDER BY和NULL

在MySQL中,NULL位于非NULL值之前。因此,当使用ASC选项创建ORDER BY子句时,结果集中首先会出现NULL。

例如,以下查询使用ORDER BY子句按reportsTo列中的值对员工进行排序:

SELECT 
firstName, lastName, reportsTo
FROM
employees
ORDER BY reportsTo;

输出:

但是,如果将ORDER BY与DESC选项一起使用,则结果集中的最后一个选项将显示为null。例如:

SELECT 
firstName, lastName, reportsTo
FROM
employees
ORDER BY reportsTo DESC;

输出:

总结