Oracle では、rownum を指定した where 句を使用して最初の 10 レコードをクエリできます。where 句はクエリの条件を制限するために使用され、rownum はクエリに対して返される行の合計数を制限するために使用されます。構文は「select * from table Name where rownum
このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。
Oracle でテーブルの上位 10 レコードをクエリするにはどうすればよいですか?
select * from test where rownum <=10
以下は rownum の概要です。
Rownum と row_number() over() の使用方法
ROWNUM は、Oracle 8 以降で提供される疑似列です。は SQL 結果には番号が付けられ、常に 1 から始まります。一般的な使用法は、ページ単位で出力することです。
例:
SELECT * FROM torderdetail a WHERE ROWNUM <= 10
このステートメントは、最初の 10 レコードを出力します。目的これは SQL サーバーの先頭と似ていますが、指定された数値範囲の出力には rownum の方が強力であると言えます
SELECT * FROM (SELECT a.*, ROWNUM rn FROM torderdetail a) WHERE rn >= 10 AND rn <= 20
このステートメントは 10 番目から 20 番目のレコードを出力します。ここでは、rownum を Example に変換します。rownum 自体は <= 比較メソッドのみを使用でき、実際の列に変換できるのは >= 比較を実行できるためです。
実際のアプリケーションでは、最新のレコードを取得する必要があることがよくあります。これには、最初にレコードを並べ替えてから行番号を取得する必要があります <=
一般に一般的な
SELECT * FROM (SELECT a.* FROM torderdetail a ORDER BY order_date DESC) WHERE ROWNUM <= 10
CSDN で議論されています。最も近い 10 件のレコードについて、誰かがこのような発言をしました
SELECT a.* FROM torderdetail a WHERE ROWNUM <= 10 ORDER BY order_date DESC
このような発言が表示される理由は主に効率の観点からです。前の発言 , それはスキャンする必要がありますテーブル全体をスキャンしてからソートし、10 レコードをフェッチします。後者のステートメントはテーブル全体をスキャンするのではなく、10 レコードのみをフェッチします。明らかに、後者のステートメントの効率ははるかに高くなります。
では、なぜ論争が起こるのでしょうか? 論争は実行順序にあります。最初にソートを実行して 10 件のレコードを取得する必要があるのでしょうか、それとも 10 件のレコードを取得してからソートすべきでしょうか? 2 つの順序でフェッチした結果はまったく逆です。最初にソートしてから 10 レコードをフェッチすると、最新の 10 レコードがフェッチされます。最初に 10 レコードをフェッチしてからソートすると、最も古い 10 レコードがフェッチされます。このステートメントの実行順序は、最初に 10 レコードをフェッチし、次にそれらを並べ替えることであると一般に考えられています。したがって、このステートメントはエラーになるはずです。しかし、これは実際には当てはまりません。このステートメントの実行順序は、order by のフィールドに関連しています。order by のフィールドが pk の場合、最初に並べ替えられ、次に 10 個の項目が取得されます (最初のステートメントよりも高速です) )、ソートフィールド PK でない場合は、10 件を取り出してソートしますが、このときの結果が要件と異なるため、2 番目の書き方ではソートフィールドが正しいことを確認する必要があります。は主キーです。
解析関数 Row_number() over() は 9I から提供されており、その汎用的な目的は rownum と同様です。
一般的な書き方 row_number() over(order by order_date desc) は、rownum ステートメントと同じ順序を生成し、効率も同じです (order by もある rownum ステートメントの場合)。どちらの場合も使い方は同じです。
グループ化の場合、最新の10件の取得はrownumでは実現できませんが、現時点ではrow_numberのみですが、グループ化後はrow_number() over(グループ化フィールド順によるソートフィールドによる分割)が可能です。たとえば、過去 1 か月間毎日の最後の 10 件の注文レコードを取得したい場合は、
SELECT * FROM (SELECT a.*, ROW_NUMBER () OVER (PARTITION BY TRUNC (order_date) ORDER BY order_date DESC) rn FROM torderdetail a) WHERE rn <= 10
Rownum の別の使用法では、すべての日の出力を必要とするこの要求が発生することがあります。データベースにそのようなテーブルはないのですが、どうすれば月のすべての日を出力できるでしょうか? rownum:
SELECT TRUNC (SYSDATE, 'MM') + ROWNUM - 1 FROM DUAL CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))
推奨チュートリアル: "Oracle Video Tutorial"
で解決できます。以上がOracle で最初の 10 レコードをクエリする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。