감 잃지말고 개발하기

[Oracle] [SQL] [쿼리] [문법] [ROWNUM] [FETCH] 출력되는 행 제한하기 본문

DB/Oracle

[Oracle] [SQL] [쿼리] [문법] [ROWNUM] [FETCH] 출력되는 행 제한하기

persii 2023. 3. 4. 19:07

출력되는 행을 제한하는 방법에는 크게 2가지가 있다.

 

예시 테이블 FOOD_PRODUCT

Column name Type Nullable Description
PRODUCT_ID VARCHAR(10) FALSE 식품 아이디
PRODUCT_NAME VARCHAR(50) FALSE 식품 이름
PRODUCT_CD VARCHAR(10) TRUE 식품 코드
CATEGORY VARCHAR(10) TRUE 식품 분류
PRICE NUMBER TRUE 식품 가격

 

테이블 데이터

아래 표는 모든 칼럼과 ROWNUM을 가격을 중심으로 올림차순으로 정렬해 출력한 모든 데이터 집합이다.

더보기

ROWNUM PRODUCT_ID PRODUCT_NAME PRODUCT_CD CATEGORY PRICE
25 P0061 맛있는생수 CD_BR00001 음료 1100
33 P0081 맛있는백미밥 CD_RI00001 1500
37 P0091 맛있는포카칩 CD_CK00001 과자 1500
34 P0082 맛있는현미밥 CD_RI00002 1800
38 P0092 맛있는고구마깡 CD_CK00002 과자 1800
13 P0031 맛있는참치 CD_CN00001 1800
40 P0094 맛있는새우깡 CD_CK00004 과자 1900
36 P0084 맛있는완두콩밥 CD_RI00004 1900
39 P0093 맛있는허니버터칩 CD_CK00003 과자  1950
35 P0083 맛있는잡곡밥 CD_RI00003 1950
14 P0032 맛있는꽁치 CD_CN00002 2100
29 P0071 맛있는미역국 CD_SU00001 2400
31 P0073 맛있는육개장 CD_SU00003 2450
27 P0063 맛있는사이다 CD_BR00003 음료 2450
26 P0062 맛있는콜라 CD_BR00002 음료 2700
30 P0072 맛있는소고기국 CD_SU00002 2700
32 P0074 맛있는김치찌개 CD_SU00004 2900
16 P0034 맛있는고등어 CD_CN00004 음료 2950
28 P0064 맛있는사과주스 CD_BR00004 음료 3100
17 P0041 맛있는보리차 CD_TE00001 3400
18 P0042 맛있는메밀차 CD_TE00002 3500
1 P0001 맛있는라면 CD_ND00001 3780
2 P0002 맛있는비빔면 CD_ND00002 3920
19 P0043 맛있는아메리카노 CD_TE00003 3950
15 P0033 맛있는골뱅이 CD_CN00003 3950
11 P0023 맛있는핫소스 CD_SC00003 소스 3950
20 P0044 맛있는라떼 CD_TE00004 4050
9 P0021 맛있는케첩 CD_SC00001 소스 4500
10 P0022 맛있는마요네즈 CD_SC00002 소스 4700
5 P0011 맛있는콩기름 CD_OL00001 식용유 4880
3 P0003 맛있는짜장 CD_ND00003 4950
4 P0004 맛있는짬뽕 CD_ND00004 4950
7 P0013 맛있는포도씨유 CD_OL00003 식용유 5950
6 P0012 맛있는올리브유 CD_OL00002 식용유 7200
12 P0024 맛있는칠리소스 CD_SC00004 소스 7950
8 P0014 맛있는마조유 CD_OL00004 식용유 8950
24 P0054 맛있는백김치 CD_KC00004 김치 16950
22 P0052 맛있는열무김치 CD_KC00002 김치 17000
23 P0053 맛있는파김치 CD_KC00003 김치 17500
21 P0051 맛있는배추김치 CD_KC00001 김치 19000

 

 

1. ROWNUM 함수 사용

ROWNUM 함수는 출력되는 데이터에 번호를 부여한다.

 

FOOD_PRODUCT 테이블에서 식품 아이디, 이름, 분류, 가격을 상단 5개의 행만 출력해 보자.

 

출력결과



ROWNUM은 PSEUDO COLUMN으로 '가짜의'라는 뜻 그대로 별표(*)로 검색해서는 출력되지 않는 감춰진 칼럼이다.

가짜 칼럼인 ROWNUM을 위의 예제와 같이 WHERE절에 사용해 행 개수를 제한하면,

FOOD_PRODUCT 테이블 전체를 다 읽지 않고 제한한 개수만큼의 행만 읽어 출력한다.

 

따라서 대용량 테이블의 데이터 상단 행만 잠깐 살펴볼 때 유용하게 사용할 수 있다. 

 

 

2. TOP-N Query 사용

출력되는 데이터 건수를 제한하기 위해 ROW_LIMITING절을 사용한다.

TOP-N Query는 정렬된 결과로부터 위쪽 또는 아래쪽의 N개의 행을 반환하는 쿼리다. 

 

1. FETCH FIRST N ROWS ONLY

FOOD_PRODUCT 테이블에서 가격이 저렴한 순으로 식품 아이디, 이름, 분류, 가격을 4개의 행으로 제한해 출력해 보자.

 

출력결과



 

 

2. FETCH FIRST N PERCENT ROWS ONLY

FOOD_PRODUCT 테이블에서 가격이 저렴한 식품들 중 20%에 해당하는 식품의 아이디, 이름, 분류, 가격을 출력해 보자.

 

출력결과


40개의 행이 있는 FOOD_PRODUCT 테이블에서 8개의 행이 출력되었다.


 

3. WITH TIES 옵션

WITH TIES 옵션을 이용하면 여러 행이 N번째 행의 값과 동일할 때 함께 출력할 수 있다. 

 

다음 예제를 보자.

 

출력결과



 

위 예제를 보면 2 ROWS를 사용했기 때문에 2개의 행이 출력될 것 같지만, 실제로는 3개의 행이 출력되었다.

세 번째 행의 PRICE 값이 두 번째 행의 PRICE 값과 동일하기 때문이다.

 

4. OFFSET 옵션

OFFSET 옵션을 이용하면 출력이 시작되는 행의 위치를 지정할 수 있다.

이때, 출력이 시작되는 행의 위치는 N+1이다. 

 

다음 예제를 보자.

FOOD_PRODUCT 테이블에서 가격이 29번째부터 저렴한 식품들의 아이디, 이름, 분류, 가격을 출력해 보자.

 

출력결과



위의 결과를 보면,

시작 행인 PRODUCT_ID P0022는 PRICE값이 4700으로 FOOD_PRODUCT 테이블 전체 식품 중에 가격이 29번째(28+1)로 저렴한 식품이며, 이 29번째 행부터 끝까지 결과가 출력되었다.

 

5. OFFSET + FETCH 

FOOD_PRODUCT 테이블에서 가격이 29번째부터 저렴한 식품들의 아이디, 이름, 분류, 가격을 출력하는데, 상단 2개의 행만 출력해 보자.

 

출력결과