DB프로그래밍

[PostgreSQL] Oracle의 ROWNUM = 1처럼 가져오는 데이터의 개수를 제한하는 함수(키워드) 및 예제 쿼리

PostgreSQL에서 Oracle의 ROWNUM = 1처럼 가져오는 데이터의 개수를 제한하는 함수(키워드)는 LIMIT입니다.

SELECT * 
FROM 테이블명 
ORDER BY 정렬기준 컬럼 DESC 
LIMIT 1; -- 오라클의 WHERE ROWNUM = 1과 동일한 역할
  • 쿼리문 가장 마지막에 LIMIT 1을 붙여주시면 됩니다.



표준 SQL 방식 (FETCH FIRST)

PostgreSQL은 SQL 표준인 FETCH FIRST 1 ROWS ONLY 구문도 완벽하게 지원합니다.

SELECT * 
FROM 테이블명 
ORDER BY 정렬기준 컬럼 DESC 
FETCH FIRST 1 ROWS ONLY;

⚠️ 주의할 점
오라클의 ROWNUM과 마찬가지로, 정렬 기준(ORDER BY) 없이 LIMIT만 사용하면 데이터베이스가 임의로 무작위 데이터를 1건 반환하므로 원하는 정렬 기준을 먼저 지정하는 것이 좋습니다.

  • FETCH FIRST 1 ROWS ONLY; 구문에서 FIRST는 “정렬된 결과의 맨 처음부터” 데이터를 가져오겠다는 뜻입니다.
  • FIRST 대신 NEXT를 사용할 수 있습니다. 두 키워드는 기능적으로 완전히 동일하며, 단어 뜻에 맞춰 쿼리를 더 자연스럽게 읽히도록 하기 위해 구분하여 사용합니다.


1. FIRST와 NEXT의 차이 (의미적 차이)

보통 단독으로 상위 N개 행을 가져올 때는 FIRST를 쓰고, 앞선 행들을 건너뛰고(Offset) 그다음 행들을 가져오는 페이징 처리를 할 때는 NEXT를 사용하면 문장이 자연스러워집니다.

  • FIRST (처음부터)
-- 처음(FIRST)부터 딱 5개 행만 가져온다.
SELECT * FROM 테이블명 
FETCH FIRST 5 ROWS ONLY;

  • NEXT (그다음부터)
-- 앞에 10개 행은 건너뛰고(OFFSET), "그다음(NEXT)" 5개 행을 가져온다.
SELECT * FROM 테이블명 
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY;

※ 사실 PostgreSQL에서는 OFFSET 10 ROWS FETCH FIRST 5 ROWS ONLY;라고 써도 똑같이 잘 작동합니다. NEXT는 문맥상 가독성을 높이기 위한 표준 SQL의 배려입니다.


2. ONLY 대신 쓸 수 있는 다른 키워드: WITH TIES

FETCH 구문에는 FIRST/NEXT 외에도 뒤쪽의 ONLY를 WITH TIES로 바꿀 수 있는 아주 강력한 기능이 있습니다.

  • ONLY: 지정한 개수만큼 딱 끊어서 가져옵니다.
  • WITH TIES: 마지막 행과 동점(동일한 정렬 값)인 데이터가 있다면, 지정한 개수를 초과하더라도 전부 결과에 포함시킵니다.

💡 예시로 보는 차이점 (점수 기준 내림차순 정렬)

만약 데이터가 아래와 같고, 공동 2등이 2명인 상황에서 상위 2명만 뽑고 싶다면?

이름점수
김철수100점 (1등)
이영희90점 (공동 2등)
박민수90점 (공동 2등)
  • FETCH FIRST 2 ROWS ONLY; 결과
    • 김철수, 이영희 (딱 2명만 출력, 박민수는 탈락)
  • FETCH FIRST 2 ROWS WITH TIES; 결과
    • 김철수, 이영희, 박민수 (2명을 지정했지만, 마지막 데이터인 이영희와 박민수의 점수가 90점으로 같으므로 동점자까지 모두 포함하여 3명 출력)

⚠️ 주의: WITH TIES를 사용할 때는 데이터의 동점 기준을 명확히 해야 하므로, 반드시 ORDER BY 절이 함께 있어야만 작동합니다.

[연관자료]

Hi, I’m 관리자