Skip to main content

SQLite Order By-按各种顺序排序结果集

SQLite ORDER BY子句简介

SQLite以未指定的顺序在表中存储数据。这意味着表中的行可能按插入顺序排列,也可能不按插入顺序排列。

如果使用SELECT语句从表中查询数据,则结果集中的行顺序未指定。

要对结果集进行排序,请将ORDER BY子句添加到SELECT语句中,如下所示:

SELECT
select_list
FROM
table
ORDER BY
column_1 ASC,
column_2 DESC;

ORDER BY子句位于FROM子句之后。它允许您根据一列或多列按升序或降序对结果集进行排序。

在这种语法中,将要排序的列名放在ORDER by子句之后,后跟ASC或DESC关键字。

如果未指定ASC或DESC关键字,SQLite将使用ASC选项对结果集进行排序。换句话说,默认情况下,它会按升序对结果集进行排序。

如果要按多列对结果集进行排序,可以使用逗号(,)分隔两列。ORDER BY子句使用列或表达式从左到右对行进行排序。换句话说,ORDER BY子句使用列表中的第一列对行进行排序。然后,它使用第二列对已排序的行进行排序,依此类推。

可以使用select子句的select列表中未显示的列对结果集进行排序。

SQLite ORDER BY子句示例

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

假设要从名称、毫秒和唱片集id列获取数据,请使用以下语句:

SELECT
name,
milliseconds,
albumid
FROM
tracks;

试试看

tracks table data without sorting

不使用ORDER BY子句的SELECT语句返回一个不按任何顺序排列的结果集。

假设要根据AlbumId列按升序对结果集进行排序,请使用以下语句:

SELECT
name,
milliseconds,
albumid
FROM
tracks
ORDER BY
albumid ASC;

试试看

SQLite ORDER BY example

结果集现在按AlbumId列按升序排序,如屏幕截图所示。

SQLite默认使用ASC,因此您可以在上述语句中省略它,如下所示:

SELECT
name,
milliseconds,
albumid
FROM
tracks
ORDER BY
albumid;

试试看

假设您想按毫秒列降序对上面的排序结果(按AlbumId)排序。在这种情况下,需要将毫秒列添加到ORDER BY子句中,如下所示:

SELECT
name,
milliseconds,
albumid
FROM
tracks
ORDER BY
albumid ASC,
milliseconds DESC;

试试看

SQLite ORDER BY multiple columns example

SQLite首先按AlbumId列按升序对行进行排序。然后,它按毫秒列按降序对排序后的结果集进行排序。

如果查看AlbumId为1的专辑的曲目,您会发现这两条语句之间的曲目顺序会发生变化。

SQLite ORDER BY与列位置

您可以在ORDER BY子句中使用列的位置,而不是指定列的名称。

例如,下面的语句按albumid(第3列)和毫秒(第2列)升序对曲目进行排序。

SELECT
name,
milliseconds,
albumid
FROM
tracks
ORDER BY
3,2;

试试看

数字3和2表示SELECT子句中出现的列列表中的AlbumId和毫秒数。

SQLite ORDER BY multiple columns by positions

排序空值

在数据库世界中,NULL是特殊的。表示信息缺失或数据不适用。

假设你想把一位艺术家的生日储存在一张桌子里。保存艺术家的唱片时,您没有生日信息。

要表示数据库中未知的生日信息,可以使用特殊日期,如01.01.1900或“”空字符串。然而,这两个值都不能清楚地表明生日是未知的。

发明NULL就是为了解决这个问题。不是使用特殊值来指示信息缺失,而是使用NULL。

NULL是特殊的,因为您无法将其与另一个值进行比较。简单地说,如果这两条信息是未知的,你就无法对它们进行比较。

空值甚至无法与自身相比;NULL不等于自身,因此NULL=NULL总是导致false。

说到排序,SQLite认为NULL比任何其他值都小。

这意味着如果使用ASC,空值将出现在结果集的开头,如果使用DESC,空值将出现在结果集的结尾。

SQLite 3.30.0在ORDER BY子句中添加了NULLS FIRST和NULLS LAST选项。NULLS FIRST选项指定NULLS将出现在结果集的开头,而NULLS LAST选项将NULLS放在结果集的末尾。

以下示例使用ORDER BY子句按作曲家对曲目进行排序:

SELECT 
TrackId,
Name,
Composer
FROM
tracks
ORDER BY
Composer;

首先,可以看到空值出现在结果集的开头,因为SQLite将其视为最低值。向下滚动结果时,您将看到其他值:

SQLite ORDER BY NULLS FIRST

以下示例使用NULLS LAST选项将NULLS置于其他值之后:

SELECT 
TrackId,
Name,
Composer
FROM
tracks
ORDER BY
Composer NULLS LAST;

如果向下滚动输出,您将看到结果集末尾放置了空值:

在本教程中,您学习了如何使用SQLite ORDER BY子句使用单列、多列升序和降序对结果集进行排序。