更新时间:2024-12-11 GMT+08:00

LIMIT | FETCH FIRST

LIMIT和FETCH FIRST都可以限制结果集中的行数。Limit和offset可以配合使用进行分页查询。

LIMIT

LIMIT { count | ALL }

下面的查询限制返回的行数为5:

SELECT * FROM fruit LIMIT 5;

LIMIT ALL与省略LIMIT的作用一样。

FETCH FIRST

FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES

FETCH FIRST支持FIRST或NEXT关键字以及ROW或ROWS关键字。这些关键字等效,不影响query执行。

  • 如果FETCH FIRST未指定数量,默认为1:
    SELECT orderdate FROM orders FETCH FIRST ROW ONLY;
      orderdate   
    --------------
     2020-11-11 
    
    SELECT *  FROM new_orders FETCH FIRST 2 ROW ONLY;
       orderkey   | orderstatus | totalprice |  orderdate   
    --------------|-------------|------------|--------------
     202011181113 | online      |     9527.0 | 2020-11-11 
     202011181114 | online      |      666.0 | 2020-11-11 
    (2 rows)
  • 如果使用了OFFSET,则LIMIT或FETCH FIRST会在OFFSET之后应用于结果集:
    SELECT * FROM (VALUES 5, 2, 4, 1, 3) t(x) ORDER BY x OFFSET 2  FETCH FIRST ROW ONLY;
     x 
    ---
     3 
    (1 row)
    
  • 对于FETCH FIRST子句,参数ONLY或WITH TIES控制结果集中包含哪些行。

    如果指定了ONLY参数,则结果集将限制为包含参数数量的前若干行。

    如果指定了WITH TIES参数,则要求必须带ORDER BY子句。其结果集中包含符合条件的前若干行基本结果集以及额外的行。这些额外的返回行与基本结果集中最后一行的ORDER BY的参数一样:

    CREATE TABLE nation (name varchar,  regionkey integer);
    
    insert into nation values ('ETHIOPIA',0),('MOROCCO',0),('ETHIOPIA',2),('KENYA',2),('ALGERIA',0),('MOZAMBIQUE',0);
    
    --返回regionkey与第一条相同的所有记录。
    SELECT name, regionkey FROM nation ORDER BY regionkey FETCH FIRST ROW WITH TIES;
        name    | regionkey 
    ------------|-----------
     ALGERIA    |         0 
     ETHIOPIA   |         0 
     MOZAMBIQUE |         0 
     MOROCCO    |         0 
    (4 rows)