Oracle의 페이징 쿼리 원칙: 1. ORACLE의 rownum 필드 특성을 사용하여 쿼리 2. 지정된 수의 N개의 데이터를 쿼리합니다. 3. 지정된 수의 쿼리 결과에서 M개의 데이터를 제거합니다. 웹 개발 시 M과 N을 매개변수로 전달하면 페이지가 매겨진 결과를 얻을 수 있습니다.
이 튜토리얼의 운영 환경: Windows 10 시스템, Oracle 11g 버전, Dell G3 컴퓨터.
페이징 원리:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!