본문 바로가기
코딩테스트/SQL

[프로그래머스] SELECT 〉Lv1. 상위 n개 레코드

by imsha 2021. 10. 9.

문제 설명

 


예시


풀이 방법

일반적으로 SQL을 작성할 때 컬럼명 즉, 열에 대한 정보를 작성하는 데 이번 문제는 열(Column)이 아닌 행(Row)에 대한 조건으로 결과를 출력해야 합니다. 보호 시작일(DATETIME)을 순서대로 정렬하여 가장 먼저 보호소에 들어온 동물이 최상단 행에 위치하도록 합니다. 그리고 LIMIT 구를 사용하여 최상단의 하나의 행만 추출합니다.

이번 시간에는 행의 수만큼 출력하는 구문인 LIMIT에 대해 배워서 제대로 익히고 넘어가보겠습니다.

 

LIMIT

LIMIT는 행에 제한을 거는 구로 MySQL과 PostgreSQL에서만 사용 가능합니다. 이와 같이 Oracle에서는 ROWNUM을, SQL Server에서는 TOP을 사용하여 LIMIT와 비슷하게 데이터베이스의 행에 제한을 걸 수 있습니다.  LIMIT의 기본 문법은 아래와 같습니다.

LIMIT number_rows [ OFFSET offset_value ];

오프셋은 상대 주소(relative address)로 일반적으로 컴퓨터 데이터 주소는 0, 1, 2, 3,... 이렇게 세는데 offset은 행을 주소화시켜 놓고 위에서 몇 번째라고 생각하면 됩니다. 그러나 최상단 행은 0번째 행으로 순서대로 내려가는 겁니다. 위 문법을 해석해 보자면 

행의 개수(number_rows)에 제한(LIMIT)을 걸겠다. [ 상대 주소 값부터 ]

라고 표현할 수 있을 것 같습니다. 그렇지만 말로 표현하니까 무슨 말인지 이해가 잘 안 가는 것 같아 위 문제를 사용하여 이해해보겠습니다. LIMIT 구에 대한 이해를 위해 코드를 새롭게 만든 것이니까 코드에 대한 이해보다 LIMIT에 대한 이해만 하면 될 것입니다.

SELECT @rownum := @rownum AS NO, 
       @rownum := @rownum + 1 AS How_many,
       NAME
FROM ANIMAL_INS,
	(SELECT @rownum := 0) AS N
ORDER BY DATETIME

 

ANIMAL_INS 테이블의 DATETIME을 오름차순으로 정렬하여 NAME만 조회하는 데, 행의 주소(0,1,2,3,...)와 얼마큼 출력할지에 대한 행의 개수를 파악하기 위한 넘버링을 추가하였습니다. 아래는 위 SQL 문의 결과로 LIMIT의 이해를 돕기 위한 결과입니다.

# 1. 상위 3개 행
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 3

# 2. 5번 주소부터 상위 3개
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 3 OFFSET 5

 

 

왼쪽은 코드이고 각 코드에 대한 결과가 오른쪽 이미지에 있습니다. 이처럼 위 코드만 이해해도 상위 n개 레코드 문제는 쉽게 풀 수 있을 것 같습니다. 그럼 이어서 문제를 풀도록 하겠습니다. 

 


문제 풀이

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1  #상위 1개 레코드

 


실행 결과

 

댓글