>  기사  >  데이터 베이스  >  오라클 페이징 쿼리의 원리는 무엇입니까?

오라클 페이징 쿼리의 원리는 무엇입니까?

WBOY
WBOY원래의
2022-01-25 16:59:315126검색

Oracle의 페이징 쿼리 원칙: 1. ORACLE의 rownum 필드 특성을 사용하여 쿼리 2. 지정된 수의 N개의 데이터를 쿼리합니다. 3. 지정된 수의 쿼리 결과에서 M개의 데이터를 제거합니다. 웹 개발 시 M과 N을 매개변수로 전달하면 페이지가 매겨진 결과를 얻을 수 있습니다.

오라클 페이징 쿼리의 원리는 무엇입니까?

이 튜토리얼의 운영 환경: Windows 10 시스템, Oracle 11g 버전, Dell G3 컴퓨터.

oracle 페이징 쿼리의 원리는 무엇인가요?

페이징 원리:

1. ORACLE의 rownum 필드의 기능 쿼리를 사용합니다.

2. 처음 N개의 데이터를 쿼리

3. 2단계의 쿼리 결과에서 M~N개의 데이터를 가져옵니다

4. 웹 개발 시 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의 경우 다음보다 작거나 크거나 같을 수만 있습니다. 따라서 Oracle 데이터베이스에서 페이징 쿼리에 대한 중요한 장애물은 이것이다.

--원칙적으로 ROWNUM은 매번 1부터 시작하여 배열해야 하는 유사 열입니다. 따라서 ROWNUM>=n입니다. 예를 들어, 1이 n(항목 수)보다 큰 경우 true가 아닙니다. ROWNUM=1로 찾을 수 있습니다. 1>=1이 성립하기 때문입니다. N=2,1>=2는 사실이 아닙니다. 따라서 첫 번째 항목만 크거나 같음을 확인할 수 있습니다. 더하기 작거나 같습니다. 내가 확인할 수 있는 건 그게 전부다. 따라서 이러한 어려움은 페이징 쿼리의 어려움과 장애물을 증가시키는 것으로 간주될 수 있습니다.

--방법 1 가장 간단한 쿼리

--항목 5~10.

--단 하나의 중첩 레이어와 하나의 하위 쿼리만 있습니다.

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 Video Tutorial"

위 내용은 오라클 페이징 쿼리의 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.