ROWNUM 은 테이블의 튜플(행)에 임시로 부여되는 일련번호
1.1.1. 사용하기 불편한 ROWNUM..!
예시) 그림에서 3번 빨간 동그라미의 정보만 보고 싶음
--3번 내용을 보기위해 다음과 같이 변경 SELECT ROWNUM AS RN, 직원ID, 이름, 연봉, 부서ID FROM 직원 WHERE ROWNUM = 3; --아래는 결과...
3번째 결과를 보기 위해선!?
=> 인라인뷰 사용 !
참고URL : 링크
상위 n개의 데이터를 추출하는 쿼리
ROWNUM 개념과 인라인뷰 개념을 조합해서
상위 N개의 특정 데이터만 뽑아내는 기술
연봉이 높은 5명만 출력할때 코드를 다음과 같이 작성하면 문제가 발생한다. 문제점을 파악하고 해결하시오.
SELECT *
FROM 직원
WHERE 연봉 IS NOT NULL
AND ROWNUM <= 5
ORDER BY 연봉 DESC;
[문제점] : ORDER BY 보다 WHERE 문법(AND)이 먼저 실행되기 때문!
[해결방안] 정렬한 후에 5개의 행을 가져옴.
→ ORDER BY가 실행된 테이블에 WHERE를 적용!! (TOP-N)
SELECT *
FROM (SELECT *
FROM 직원
WHERE 연봉 IS NOT NULL
ORDER BY 연봉 DESC)
WHERE ROWNUM <= 5;
-- 1. 직원 중에 연봉이 낮은 하위 3명의 모든 정보를 출력해주세요.
-- (연봉NULL인 대상 제외)
SELECT *
FROM (SELECT *
FROM 직원
WHERE 연봉 IS NOT NULL
ORDER BY 연봉 ASC)
WHERE ROWNUM <= 3;
-- 2. 직원들 중에 가장 최근에 입사한 3명의 모든 정보를 출력해주세요.
--(입사일자가 NULL인 대상은 제외)
SELECT *
FROM (SELECT *
FROM 직원
WHERE 입사일시 IS NOT NULL
ORDER BY 입사일시 DESC)
WHERE ROWNUM <= 3;
페이징 구현전 SQL 테이브 생성과 데이터 넣기!
---게시판 테이블 만들고 데이터 100만건 넣기
CREATE TABLE 게시판 (
게시판번호 NUMBER(9) PRIMARY KEY ,
작성자 VARCHAR2(50) NOT NULL ,
게시물내용 VARCHAR2(4000) NOT NULL ,
작성일시 DATE NOT NULL
) ;
INSERT INTO 게시판
SELECT LEVEL -- 게시판번호
, '아이디' || MOD(LEVEL , 10000) -- 작성자
, '아이디' ||
MOD(LEVEL , 10000) ||
'님이 작성하신 게시물입니다. 이 게시물은 게시판 번호가 '
|| LEVEL
|| '입니다' -- 게시물내용
, TO_DATE('20000101') + LEVEL --2022년 1월1일부터 하루씩 게시물이 입력되는 것
FROM DUAL
CONNECT BY LEVEL <=1000000; --100만건의 데이터 입력
COMMIT;
- 다음과 같이 생성된 데이터의 ROWNUM을 20번째까지 출력할 수 있다.
SELECT * FROM (SELECT * FROM 게시판 ORDER BY 작성일시 DESC ) WHERE ROWNUM <= 20 ;
- 페이징 기술 구현을 위해 다음 21번 부터 40번까지 출력하려면?
=> 2번 인라인뷰를 하면 된다.
-- 페이징 21번부터 40번까지 출력 SELECT * FROM( SELECT ROWNUM AS RN, A.* FROM ( SELECT * FROM 게시판 ORDER BY 작성일시 DESC ) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 ;
=> 21번부터 40번가지 출력됨 !
3. 41번 부터 60번까지 출력은?--41 ~ 60번 출력 SELECT * FROM( SELECT ROWNUM AS RN, A.* FROM (SELECT * FROM 게시판 ORDER BY 작성일시 DESC ) A WHERE ROWNUM <= 60) WHERE RN >= 41 ; --41 숫자와 60번 숫자를 변경해주면 된다.