[프로그래머스] 상위 n개 레코드 - SQL

김동현·2022년 8월 9일
0

상위 n개 레코드 문제
https://school.programmers.co.kr/learn/courses/30/lessons/59405

문제설명

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

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N) TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE

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

예시

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A399552Dog2013-10-14 15:38:00NormalJackNeutered Male
A379998Dog2013-10-23 11:42:00NormalDiscipleIntact Male
A370852Dog2013-11-03 15:04:00NormalKatieSpayed Female
A403564Dog2013-11-18 17:03:00NormalAnnaSpayed Female

이 중 가장 보호소에 먼저 들어온 동물은 Jack입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

NAME
Jack

※ 보호소에 가장 먼저 들어온 동물은 한 마리인 경우만 테스트 케이스로 주어집니다.



내 코드

-- MySQL
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;
  • LIMIT 1을 통해 테이블 제일 위에 있는 동물의 이름을 구해올 수 있다.
--Oracle
SELECT NAME
FROM (SELECT * FROM ANIMAL_INS ORDER BY DATETIME)
WHERE rownum = 1;
  • FROM 다음에 나오는SELECT * FROM ANIMAL_INS ORDER BY DATETIME 인라인 뷰를 통해 보호일 시작 기준으로 가상의 테이블을 만들어 where rownum = 1을 통해 가장 첫 번째 행의 이름 데이터를 가져올 수 있다.

알게된 점

MySQL

  • LIMIT을 통해 테이블 데이터 조회시 한계를 지정할 수 있다.

    ex)

    LIMIT 1 : 맨 위에서부터 1개 까지의 정보 조회
    LIMIT 2 : 맨 위에서부터 2개 까지의 정보 조회
    LIMIT 2,6 : 3번째 부터 6개 까지의 정보 조회
    (6번째 까지가 아닌 6개의 데이터를 조회한다.)

Oracle

  • 서브쿼리
    • 쿼리 안에 들어가는 또 다른 쿼리
    • 서브쿼리를 어느 위치에서 쓰냐에 따라 다르게 불린다.
  1. 스칼라 서브쿼리(SELECT절 서브쿼리)
    - 이 때, 서브쿼리의 결과는 반드시 단일 행이나 SUM, COUNT 등의 집계 함수를 거친 단일 값으로 리턴되어야 한다.
    이유는 서브쿼리를 끝마친 값하나를 메인쿼리에서 SELECT 하기 때문.
  1. 인라인 뷰 서브쿼리(FROM절 서브쿼리)
  • 결과는 하나의 테이블로 리턴된다.
  • 가상의 테이블을 하나 더 만든다라고 생각해도 된다.
  • 페이징 처리(최신 순 등으로 레코드를 잘라서 화면에 보여주는 것)를 인라인 뷰를 통해 할 수 있다.
  1. 중첩 서브쿼리(WHERE절 서브쿼리)
  • 가장 흔하게 쓰이는 서브쿼리이며 단일행과 복수행 둘 다 리턴 가능하다.
    -MAX, MIN과 같이 결과물이 하나만 나오는 경우에는 = 을 많이 사용하고 서브쿼리의 결과물이 여러개가 나온다면(특정 컬럼 기준으로 정렬해서 상위 몇개만 가지고 온다... 등등) IN을 많이 사용한다.
profile
오늘은 오늘

0개의 댓글