Oracle ページング クエリの原理は何ですか

WBOY
リリース: 2022-01-25 16:59:31
オリジナル
5257 人が閲覧しました

Oracle のページング クエリの原則: 1. ORACLE の rownum フィールドの特性を使用してクエリを実行します; 2. 指定された数の N 個のデータをクエリします; 3. 指定された数の N 個のデータから M 個のデータを削除しますクエリ結果の数; 4. Web 開発では、M と N をパラメータとして渡すことで、ページ分割された結果を取得できます。

Oracle ページング クエリの原理は何ですか

このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。

Oracle ページング クエリの原理とは何ですか?

ページングの原理:

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート