오라클 데이터베이스의 테이블에서 데이터를 찾아올 때 SELECT 문을 사용하여 테이블 데이터를 가져오게 됩니다.
SELECT 문으로 쿼리를 실행했을 때 WHERE 조건에 해당하는 테이블 행(Row)의 원하는 컬럼(Column) 데이터를 모두 가져와서 처리하는 것이 일반적인 SELECT 문의 사용 방법입니다.
하지만 오라클의 SELECT 쿼리 문을 실행했을 때 결과로 출력 되는 행(Row)의 수를 제한해서 가져오도록 구현해줄 경우가 생기게 됩니다.
ORDER BY 정렬이 된 상태에서 상위 또는 하위 몇 개만 가져오거나 또는 비율로 몇 퍼센트에 해당하는 자료만 가져오도록 쿼리 문을 구현해 줄 필요가 생길 때가 있습니다.
물론 쿼리 문으로 조건에 맞는 전체 테이블 행의 데이터를 가져오면서 프로그램 적으로 원하는 자료만 취합해서 구현할 수도 있지만 처음 쿼리 문으로 데이터를 가져올 때부터 미리 원하는 행의 수를 제한해서 가져오도록 쿼리 문을 구현한다면 훨씬 간단하게 처리할 수 있을 것이라 생각됩니다.
이번 글에서는 ORACLE의 SELECT 문에서 출력 되는 Row 수를 제한하는 방법 5가지에 대해 알아보겠습니다.
참고로 아래 설명에서 사용되는 FETCH, OFFSET 구문은 Oracle 12c 이후 버전부터 사용이 가능한 기능입니다.
지정된 행의 개수만큼 가져오기 – FETCH FIRST n ROWS ONLY
▶ FETCH FIRST n ROWS ONLY는 테이블에서 지정한 행(Row)의 수만큼 결과로 출력해 줍니다.
– FETCH는 SELECT 문의 실행 결과 반환할 행의 수를 지정할 때 사용합니다.
▷ 사용 예
- SELECT name, score
FROM student
ORDER BY score DESC
FETCH FIRST 5 ROWS ONLY; - 설명 : student 테이블에서 score가 높은 순으로 5개의 행만 결과로 가져옵니다.
지정된 비율만큼 행의 개수 가져오기 – FETCH FIRST n PERCENT ROWS ONLY
▶ FETCH FIRST n PERCENT ROWS ONLY는 테이블에서 지정한 비율(퍼센트)에 해당하는 행(Row)의 수만큼 결과를 출력해 줍니다.
▷ 사용 예
- SELECT name, score
FROM student
ORDER BY score DESC
FETCH FIRST 20 PERCENT ROWS ONLY; - 설명 : student 테이블에서 score가 높은 순으로 20%에 해당하는 행(Row)의 수만큼 결과를 가져옵니다.
지정된 행의 개수만큼 가져오기(중복 포함) – FETCH FIRST n ROWS WITH TIES
▶ FETCH FIRST n ROWS WITH TIES는 테이블에서 지정한 행(Row)의 수만큼 결과를 가져오는 것은 FETCH FIRST n ROWS ONLY와 같지만 지정한 행의 수에서 내용이 같은 행이 존재할 경우 그 행도 포함해서 결과를 출력해 줍니다.
▷ 사용 예
- SELECT name, score
FROM student
ORDER BY score DESC
FETCH FIRST 3 ROWS WITH TIES; - 설명 : student 테이블에서 score가 높은 3개의 행을 가져오는데 만약 가져오는 3개의 score와 동일한 행이 여러 개 있을 경우 해당 행을 모두 포함해서 결과를 가져오게 됩니다.
시작되는 행의 위치를 지정 – OFFSET n ROWS
▶ OFFSET n ROWS는 건너 뛸 행의 수를 지정합니다. 즉, 시작되는 행의 위치를 지정해서 출력할 때 사용합니다.
▷ 사용 예
- SELECT name, score
FROM student
ORDER BY score DESC
OFFSET 5 ROWS; - 설명 : OFFSET에서 지정한 행의 위치부터 테이블의 끝까지 결과를 가져옵니다.
ORDER BY 정렬 된 상태에서 6번째 행부터 마지막 행까지 결과를 출력하게 됩니다.
OFFSET과 FETCH를 조합해서 사용하는 방법
▶ OFFSET과 FETCH를 조합해서 사용할 수도 있습니다.
▷ 사용 예
- SELECT name, score
FROM student
ORDER BY score DESC
OFFSET 5 ROWS
FETCH FIRST 3 ROWS ONLY; - 설명 : OFFSET으로 인해 시작 행은 6번째 행이 되고, FETCH FIRST로 인해 3개의 행만 출력하니 결과적으로 6, 7, 8 행만 출력하게 됩니다.
마무리
오라클에서 SELECT 쿼리 문의 실행 결과로 출력 되는 행(Row)의 수를 제한하는 방법에 대해 알아보았습니다.
설명한 내용을 응용해서 사용하면 좀 더 다양한 실행 결과를 출력할 수 있습니다.
프로그램 적으로 순위를 정하는 복잡한 구문을 사용할 필요 없이 쿼리 문으로 간단하게 처리할 수 있어 알아두면 무척 유용하게 사용할 수 있습니다.
단, 본문 글의 시작 부분에서 언급했지만 FETCH, OFFSET은 Oracle 12c 버전 이후부터 사용 가능한 기능입니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
- ORACLE SELECT 구문의 GROUP BY SUM()에 대한 Total과 Sub Total 추가 방법
- 오라클 ORA-00904: invalid identifier 오류 발생 원인 및 오류 해결 방법
- 오라클 ORA-01789:query block has incorrect number of result columns 오류해결
- 오라클 ORA-01438 오류 발생 원인과 해결 방법
- Unable to find specified column in result set 오류 원인 및 해결 방법
- ‘형식 이니셜라이저에서 예외를 throw했습니다.’ 오류 해결 방법
이 글이 도움이 되었기를 바랍니다. ^-^