MySQL:结果集限制、排序

278 阅读2分钟

前言

对于检索出来的结果集,一般不可能完全能够满足我们的程序需求。

我还需要结果集进行结果集限制、排序、过滤、分组等等的操作。

这篇文章主要是根据自己的学习,简单的总结和讲讲结果集限制和结果集排序两小部分。

内容

结果集限制

LIMIT子句用于对SELECT语句检索回来的结果集的初始行数和最大行数做限制。

子句的使用包括两个参数:

  • row_count: 返回的结果集行数的最大值;

  • offset: 返回的第一行的偏移量;

这两个参数就能够确定返回结果集的第一行和最后一行的闭合区间。

LIMIT的使用格式上,有两种形式:

    # 方式一
    SELECT * FROM [table_name] LIMIT [offset], [row_count];
    
    # 方式二,MySQL 5的新语法
    SELECT * FROM [table_name] LIMIT [row_count] OFFSET [offset];

可以看出,方式二的这种格式相对于格式一是更加清晰直观,个人倾向于使用第二种方式。

注意:offset变量中,初始行的偏移量是0,而不是1(这点和数组的下标起始为0是相同的)。

结果集排序

通过SELECT语法检索出来的结果集是无序的。如果需要返回经过特定排序的结果集,需要在SELECT语句上添加ORDER BY子句。

ORDER BY子句根据列进行结果集的排序。关键词ASCDESC用于指定列的排序方式:

  • ASC:升序排序(从A到Z);

  • DESC:降序排序(从Z到A);

ASC为默认值,在不同关键词指定的情况下,默认使用升序方式进行排序。降序排序需要自己添加上DESC关键词。

    # 升序排序
    SELECT * FROM [table_name] ORDER BY [column_name];
    
    # 降序排序
    SELECT * FROM [table_name] ORDER BY [column_name] DESC;

ORDER BY子句还支持对多个列进行排序,并对每一个列的排序方式单独设定。

    # 多列排序
    SELECT * FROM [table_name] ORDER BY [column_name_1] [ASC | DESC], [column_name_2] [ASC | DESC];

ORDER BY子句的多列排序会完全按照所规定的顺序进行。拿上面的例子做说明:先对column_name_1进行排序,仅在多个行具有相同的column_name_1值时才对这些行进行按column_name_2的排序。

检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。

参考资料