[Oracle] 의사 컬럼, Pseudo Column (rownum 사용법)

수경·2023년 9월 7일
0
post-thumbnail

의사 컬럼, Pseudo Column

  • 실제 컬럼이 아닌데 컬럼처럼 행동하는 객체

rownum

  • 행번호로 사용한다.
  • 오라클 전용 객체이다. > MS-SQL(top n) / MySQL(limit n,m)
  • 번호를 생성하는 비슷한 기능으로 시퀀스 객체와 유사하다.
  • 시퀀스 : 자신이 규칙에 따라 번호를 생성한다.
  • rownum : 현재 테이블의 행번호를 가져오는 역할
  • 페이지로 나눠 조회하기가 가능해진다.❗

rownum이 적용되는 순서

  • from 절이 실행될 때 각 레코드에 rownum을 할당한다.(****)
  • where절이 실행될 때 상황에 따라 rownum 재계산된다.(***) > from절에서 만들어진 rownum은 where절이 실행될 때 변경될 수 있다.
  • 테이블에 저장된 값이 아닌 select 실행 시 동적으로 계산되어 만들어진다.(***)

rownum 사용방법

SELECT name, buseo, rownum		-- 3. 소비 : 1에서 만든 rownum을 가져온다.
FROM tblinsa					-- 1. 생성 : FROM 절이 실행되는 순간 모든 레코드에 rownum 할당
WHERE rownum = 1;				-- 2. 조건검색 : 조건에 부합하지 않은 행을 제외하고 조건을 검색한다.

주의!

SELECT name, buseo, rownum		-- 3. 소비
FROM tblinsa					-- 1. 생성
WHERE rownum = 5;				-- 2. 조건검색

첫번째 행이 rownum 1이므로 조건에 맞지않은 행을 제외하고 다음 행부터 rownum 1으로 다시 계산되어 비교한다. 즉, 마지막까지 rownum 1과 rownum 5를 비교하게 되므로 결과값이 없다.

원하는 순서대로 정렬 후 rownum을 할당하는 방법

  • 서브쿼리 사용(***)
  1. 내가 원하는 순서대로 정렬
  2. 1을 서브쿼리로 묶는다. + rownum(rnum)
  3. 2을 서브쿼리로 묶는다. + rnum 사용(***)
-- 급여 5~10등까지

SELECT name, buseo, basicpay,rnum, rownum  				--3.
FROM (
			SELECT 										--2.
				name, buseo, basicpay, rownum AS rnum
			FROM(
				SELECT name, buseo, basicpay			--1.
				FROM tblinsa							
				ORDER BY basicpay DESC))		
WHERE rnum >=5 AND rnum <=10;

rownum으로 페이징

  • 한번에 20명씩보기 + 이름순으로
-- *와 컬럼 하나를 추가하고 싶다면 alias 이용하기
SELECT *
FROM (
	SELECT 
		a.*, rownum
	FROM (SELECT *
			FROM tbladdressbook
			ORDER BY name ASC) a)
WHERE rownum BETWEEN 1 AND 20;

뷰로 페이징

  • 뷰보다 서브쿼리를 더 많이 이용한다.
CREATE OR REPLACE VIEW vwAddressBook
AS 
SELECT a.*, rownum AS rum
FROM (SELECT *
		FROM tbladdressbook
		ORDER BY name ASC) a;

SELECT *
FROM vwaddressbook
WHERE rum BETWEEN 1 AND 20;
profile
웹백엔드개발자를 꿈꾸는

0개의 댓글