[DB] 상위 n개 레코드 뽑기

김나영·2023년 2월 27일
1

DATABASE

목록 보기
5/9

프로그래ㅁㅓ스에서 1레벨 문제를 풀고 이따,,
(응애 인증해벌임 ㅋㅋㄹㅃㅃ)

상위 n개 레코드 뽑기

동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL문 작성하기

상위 레코드를 뽑는것이 기억이 안나서 답변들을 보다가
MYSQL과 ORACLE의 풀이가 다른것을 확인했다,,, 이런부분에서도 차이점이 있었다니,,

나는 여기서 멈춰벌임,,,,

MYSQL에서는 LIMIT를 사용해서 원하는 갯수의 레코드를 뽑아 올 수 있지만
ORACLE에서는 LIMIT가 없기 때문에 ROWNUM을 사용한 풀이방법이 많아따,,

MYSQL 풀이법

SELECT NAME
  FROM ANIMAL_INS
 ORDER BY DATETIME
 LIMIT 1;

ORACLE 풀이법

SELECT NAME
  FROM ( 
         SELECT NAME
           FROM ANIMAL_INS
          ORDER BY DATETIME
       )
 WHERE ROWNUM = 1;

그래서 LIMIT 와 ROWNUM에 대해서 간단하게 정리해보아따.

LIMIT

쿼리 결과 개수를 제한할 수 있는 연산자.
LIMIT 로 지정하는 것은 '최대 행수' 이므로 테이블에 1개의 행만 있으면 LIMIT 3으로 해도 1개의 행만 반환한다.
SELECT 문의 마지막에 지정하는 것으로 WHERE, ORDER BY 뒤에 지정한다.
SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수

OFFSET 지정을 하게 되면 지정한 시작위치부터 행을 반환한다.
위치 지정은 시작행 -1
SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 시작행

ROWNUM

오라클에서 LIMIT를 사용한것과 같은 값을 내기 위해서는 SELECT절로 한번 감싼 후에 ROWNUM 조건을 주면 된다.

SELECT NAME
  FROM ( 
         SELECT NAME
           FROM ANIMAL_INS
          ORDER BY DATETIME
       )
 WHERE ROWNUM = 1;

원하는 구간의 행을 출력하기 위해서는 내부쿼리에서 순위함수를 사용하여 행의 번호를 지정한 다음 해당 번호의 구간을 잘라야 한다.

SELECT NAME
  FROM ( 
         SELECT ROW_NUMBER() OVER (ORDER BY DATETIME) NUM, A.*
           FROM ANIMAL_INS A
          ORDER BY DATETIME
       )
 WHERE NUM BETWEEN 3 AND 9;

ORDER BY가 필요 없다면 ROWNUM 키워드를 이용하여 행의 번호를 매길 수 있다.

SELECT NAME
  FROM ( 
         SELECT ROWNUM NUM, A.*
           FROM ANIMAL_INS A
       )
 WHERE NUM BETWEEN 3 AND 9;
profile
응애 나 애기 개발자

0개의 댓글