Oracle のページング クエリの原則: 1. ORACLE の rownum フィールドの特性を使用してクエリを実行します; 2. 指定された数の N 個のデータをクエリします; 3. 指定された数の N 個のデータから M 個のデータを削除しますクエリ結果の数; 4. Web 開発では、M と N をパラメータとして渡すことで、ページ分割された結果を取得できます。
このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。
ページングの原理:
1. ORACLE の rownum フィールドの特性を使用してクエリを実行します。
2. 最初の N 個のデータをクエリします。
3. ステップ 2 のクエリ結果から M ~ N 個のデータを取得します。
4. Web の場合開発 ページ分割された結果を取得するには、パラメータとして M と N を渡します。
例: テーブル内の 20 ~ 30 件のレコードをクエリする場合、SQL ステートメントは次のようになります。
select * from( select rownum as pageNo, A.* from tableName A where rownum <= 30) B where B.pageNo >=20;
例:
--従業員表で最も給与の高い上位 5 人を取得するにはどうすればよいでしょうか?
SELECT * FROM( SELECT * FROM emp ORDER BY sal DESC) WHERE Rownum<6
--従業員テーブルで給与が 5 位にランクされている従業員の情報を取得する方法
SELECT * FROM( SELECT * FROM emp ORDER BY sal DESC) WHERE Rownum=5
--クエリにコンテンツが見つかりません
- -同じ ROWNUM>=5 クエリ 5 最初の場所以降の結果も失敗しました
--これには ROWNUM が関係しますが、ROWNUM より小さい値のみを指定できますが、それ以上にすることはできません。つまり、Oracle データベースでのページング クエリに対する重要な障害はこれです。
--原理としては、ROWNUMは毎回1から並べなければならない擬似列です。したがって、ROWNUM>=n となります。たとえば、1 が任意の n (項目数) より大きいかどうかは当てはまりません。 ROWNUM=1 で見つけることができます。 1>=1 が成り立つからです。 N=2,1>=2 は当てはまりません。したがって、最初の項目のみが以上であるかどうかをチェックできます。プラス以下。私が確認できるのはこれだけです。したがって、この難しさは、ページング クエリの難しさと障害を増大させるとみなすことができます。
--方法 1 最も単純なクエリ
--記事 5 ~ 10。
--ネスト層とサブクエリは 1 つだけです。
SELECT * FROM (SELECT ROWNUM rn ,e.* FROM emp e WHERE ROWNUM<=10) WHERE rn>=5;
--これは実際には次のメソッドから変換されます。
--つまり、サブクエリによって取得された新しいテーブルが再度クエリされます。
--重要なステップは ROWNUM rn です。
--e.* を忘れないでください。そうしないと完全なデータが存在しません。
SELECT * FROM (SELECT ROWNUM rn, e.* FROM emp e WHERE ROWNUM <= 10) table_1 WHERE table_1.rn>= 5;
--上はソートされていません、次はソートされています
--クエリを実行する前に最初にソートする必要があるため、テーブルが大きくなるほど効率が遅くなります。
--方法 2
SELECT * FROM (SELECT ROWNUM rm ,e.* FROM emp e order by sal DESC ) WHERE rm>=5 AND rm<=10
--以下は分析関数を使用する方法です;
--方法 3
SELECT * FROM (SELECT emp.*, ROW_NUMBER () OVER (ORDER BY sal DESC) rank FROM emp) WHERE rank >=6 AND rank<=10;
--ただし、実際のクエリ結果を見ると、まったく異なることがわかります。
--手動でチェックしました。解析関数法の結果は正しいです。分かりません。
--誰か説明してもらえますか?
--意味のない
SELECT * FROM (SELECT e.*, ROWNUM AS rn from ( SELECT * FROM emp ORDER BY sal DESC) e )ee WHERE ee.rn>=5 AND ee.rn<=10
--方法 4 (Baidu、Tmall クエリなどの大規模なデータ クエリ)
SELECT * FROM( SELECT e.* ,ROWNUM rn FROM ( SELECT * FROM emp ORDER BY sal DESC ) e WHERE ROWNUM<=10 )WHERE rn>=6;
--分解手順
--最初のステップ:
SELECT * FROM emp ORDER BY sal DESC
--2 番目のステップ:
SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e
--3 番目のステップ:
SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE ROWNUM<=10
--4 番目のステップ:
SELECT * FROM( SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE ROWNUM<=10) WHERE rn>=5
--間違った推測です。
SELECT e .*,ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal DESC) e WHERE rn<=10
--エイリアスを作成するには、データ テーブルをクエリする必要があります。
--クエリ条件はまだ存在しない条件によって判断されるため、当然失敗します。
--方法 5、アイドル的で退屈な使用法
WITH ee AS ( SELECT e.*, ROWNUM rn FROM ( SELECT * FROM emp ORDER BY sal DESC )e ) SELECT ee.* FROM ee WHERE ee.rn>=5 AND ee.rn<=10
推奨チュートリアル: 「Oracle ビデオ チュートリアル 」
以上がOracle ページング クエリの原理は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。