sql >> データベース >  >> RDS >> Oracle

ROWNUMはページネーションクエリでどのように機能しますか?

    4つの質問があり、すべて ROWNUMの使用法と機能を中心に展開しています 。それぞれの質問に1つずつ答えます。

    理由(SOで検索するまではこれが最初の試みでした)Select * From Person Where rownum> 100 and rownum <110; 0行を返しますか?

    ROWNUMとここでのページネーションに関するThomasKyteによる素晴らしい説明。

    ROWNUM 値は、述語フェーズを通過した後に行に割り当てられます クエリの、ただしクエリが並べ替えまたは集計を行う前。また、ROWNUM値は割り当てられた後にのみインクリメントされるため、次のクエリは行を返しません。

    select * 
      from t 
     where ROWNUM > 1;
    

    ROWNUM> 1は最初の行には当てはまらないため、ROWNUMは2に進みません。したがって、ROWNUM値が1より大きくなることはありません。

    Select ... FROM ... WHERE rownum BETWEEN lowerBoundとupperBoundのような簡単な方法がないのはなぜですか?

    はいあります。 Oracle 12cから 以降、新しいトップn行制限を使用できます 特徴。ここで私の答えを参照してください。

    たとえば、次のクエリは、4番目に高いの間の従業員を返します。 7番目に高い給与まで 昇順:

    SQL> SELECT empno, sal
      2  FROM   emp
      3  ORDER BY sal
      4  OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
    
         EMPNO        SAL
    ---------- ----------
          7654       1250
          7934       1300
          7844       1500
          7499       1600
    
    SQL>
    

    結果の値のr列を取り除く方法は?

    select *の代わりに 、外部クエリに必要な列名をリストします。クエリを頻繁に使用する場合、ビューの作成は単純な1回限りのアクティビティです。

    または、 SQL*Plus NOPRINTを使用できます 指図。表示したくない列名は表示されません。ただし、SQL*Plusでのみ機能します。

    たとえば、

    COLUMN column_name NOPRINT
    

    たとえば、

    SQL> desc dept
     Name                                      Null?    Type
     ----------------------------------------- -------- ------------
     DEPTNO                                             NUMBER(2)
     DNAME                                              VARCHAR2(14)
     LOC                                                VARCHAR2(13)
    
    SQL> COLUMN dname NOPRINT
    SQL> COLUMN LOC NOPRINT
    SQL> SELECT * FROM dept;
    
        DEPTNO
    ----------
            10
            20
            30
            40
    
    SQL>
    

    正しいページ付けを保証しますか?

    はい、ページネーションクエリを正しく記述すれば可能です。

    たとえば、

    SELECT val
    FROM   (SELECT val, rownum AS rnum
            FROM   (SELECT val
                    FROM   t
                    ORDER BY val)
            WHERE rownum <= 8)
    WHERE  rnum >= 5;
    
           VAL
    ----------
             3
             3
             4
             4
    
    4 rows selected.
    
    SQL>
    

    または、上記で示したように、12cで新しい行制限機能を使用します。

    ここにいくつかの良い例があります。



    1. SET TEXTSIZEがSQLServerで機能しませんか?これをチェックして。

    2. SQL、結果を連結する方法は?

    3. MySQLのinformation_schemaデータベースに関する情報

    4. クラウドベンダーの詳細:AWSAurora上のPostgreSQL