코딩테스트연습/[프로그래머스] Oracle

[프로그래머스] Oracle Lv.1 - 상위 n개 레코드

_꼬마돌 2023. 8. 21. 19:53
반응형

[프로그래머스] Oracle Lv.1 - 상위 n개 레코드

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/59405?language=oracle 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다. 

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

 

풀이

서브쿼리에서 SELECT문으로 ANIMAL_INS를 DATETIME을 기준으로 오름차순으로 조회했다. 본 쿼리에서는 서브쿼리에서 DATETIME순으로 불러온 ANIMAL_INS 데이터중 NAME만을 조회하며, WHERE절에서 ROWNUM으로 첫 번째 행만을 조회했다. 

ROWNUM
오라클에서 각 행에 부여되는 순차적인 번호를 나타내는 값이다. 쿼리 결과의 행 번호를 나타내며, 주로 행 제한이나 순서 지정과 관련된 작업에 사용된다. WHERE절에 사용하면 특정 행을 선택할 수 있다.
WHERE ROWNUM = 1은 첫 번째 행을 선택,
WHERE ROWNUM <= 10은 최대 10개의 행을 선택한다.

 

소스코드

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

 

다른 풀이

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
FETCH FIRST 1 ROW ONLY; -- 결과 집합에서 가장 처음에 나타나는 1행만 가져온다.

FETCH는 SQL문에서 사용되는 절(clause)중 하나로, 쿼리 결과에서 특정 개수의 행을 가져오는 데 사용된다. 일반적으로 ORDER BY와 함께 사용되어 정렬된 결과에서 원하는 범위의 행을 선택할 때 사용된다. 

 

일반적인 구문 형식

FETCH {FIRST | NEXT} [n] {ROW | ROWS} ONLY

- FIRST 또는 NEXT

결과 집합에서 처음부터 또는 다음 행을 가져올 것인지를 지정한다. 

- n

가져올 행의 개수를 지정한다. 이는 선택적인 부분이며, 생략하면 기본적으로 1행을 가져온다. 

- ONLY

특정 행만 가져올 것임을 나타낸다. 

※ FETCH 절은 모든 데이터베이스 시스템에서 지원되지 않을 수 있으며, 지원되는 경우에도 문법이 조금씩 다를 수 있다. 

 

 

FIRST와 NEXT의 정확한 차이점을 알고 싶어서 프로그래머스에서 실험도 해보고 GPT에게도 물어봤다.

 

ANIMAL_INS 테이블이 위와 같을 때,

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
FETCH FIRST 3 ROW ONLY;

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
FETCH NEXT 3 ROW ONLY;

-- FIRST 3과 NEXT 3 모두 Jack, Disciple, Katie 순으로 이름 3개를 출력했다.
===========================================

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
FETCH FIRST 1 ROW ONLY;

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
FETCH NEXT 1 ROW ONLY;

-- FIRST 1과 NEXT 1 모두 Jack 하나만 출력했다.
-- 그냥 동일한 기능을 수행하는 것 같다,,

GPT에게 물어본 바로는 NEXT와 FIRST는 대부분의 상황에서 동일한 결과를 반환하고 실제로 어떤 것을 사용하느냐에 따라 결과에 큰 차이가 없다고 한다. 다만, 미묘한 문법적 차이가 있기 때문에, 아래 경우에 따라 둘 중 하나를 선택해서 사용하면 된다.

1. 표준 규약을 따르기 위해

SQL 표준 규격에 따르는 것이 중요한 상황에서는 FIRST를 사용하는 편이 좋다. 

2. 가독성과 명확성

FIRST가 읽기 쉽고 명확한 의미를 전달하는 경우, 코드의 가독성을 높이기 위해 선택할 수 있다. 

3. 데이터베이스 종속성

특정 데이터베이스 시스템에서 NEXT 또는 FIRST중 하나가 더 표준적으로 지원되는 경우가 있을 수 있다.

반응형