Programmers SQL 문제 풀기 | WITH RECURSIVE, COALESCE()

나나·2025년 5월 10일
0

SELECT: 가장 큰 물고기 10마리 구하기

문제

FISH_INFO 테이블에서

  • 가장 큰 물고기 10마리의 ID와 길이를 출력하는 SQL 문을 작성해주세요.
  • 결과는 길이를 기준으로 내림차순 정렬하고, 길이가 같다면 물고기의 ID에 대해 오름차순 정렬해주세요.
  • 단, 가장 큰 물고기 10마리 중 길이가 10cm 이하인 경우는 없습니다.

코드

-- 코드를 작성해주세요
SELECT ID, LENGTH
FROM FISH_INFO 
WHERE LENGTH IS NOT NULL
ORDER BY LENGTH DESC, ID
LIMIT 10;

설명

WHERE절에서 가장 큰 물고기 10마리 중 10CM 이하인 경우가 없으므로 LENGTH는 NULL이 아닌 것을 필터링합니다.
또한, 길이를 기준으로 10마리를 LIMIT를 활용해 추출합니다.

SELECT: 특정 물고기를 잡은 총 수 구하기

⭐⭐

문제

  • FISH_INFO 테이블에서 잡은 BASS와 SNAPPER의 수를 출력하는 SQL 문을 작성해주세요.
  • 컬럼명은 'FISH_COUNT`로 해주세요.

코드

-- 코드를 작성해주세요
SELECT COUNT(*) AS 'FISH_COUNT'
FROM FISH_INFO F JOIN FISH_NAME_INFO N ON F.FISH_TYPE = N.FISH_TYPE
WHERE N.FISH_NAME = 'BASS' OR N.FISH_NAME = 'SNAPPER'

설명

먼저 두 테이블을 FISH_TYPE을 기준으로 조인합니다.
그 후 WHERE절에서 BASS와 SNAPPER인 경우를 필터링하고 COUNT합니다.

GROUP BY: 입양 시각 구하기(1)

⭐⭐

문제

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.

  • 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
  • 이때 결과는 시간대 순으로 정렬해야 합니다.

코드

-- 코드를 입력하세요
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT'
FROM ANIMAL_OUTS 
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME)

설명

WHERE절에서 시간이 9와 19 사이인 것을 필터링합니다.
그 후 시간으로 GROUP BY하여 집계함수인 COUNT를 사용하여 시간대별 입양 건수를 구합니다.

GROUP BY: 입양 시각 구하기(2)

⭐⭐⭐⭐

문제

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.

  • 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
  • 이때 결과는 시간대 순으로 정렬해야 합니다.

코드

WITH RECURSIVE NUM AS (
    -- Non-Recursive 문장(첫번째 루프에서만 실행됨)
    SELECT 0 AS HOUR 
    UNION ALL
    -- Recursive 문장(읽어 올 때마다 행의 위치가 기억되어 다음번 읽어 올 때 다음 행으로 이동함)
    SELECT HOUR + 1 FROM NUM
    WHERE HOUR < 23
    )

SELECT
    N.HOUR,
    -- COALESCE(A,B): 한쪽이 NULL이면 NULL이 아닌 값으로, 둘다 NULL이 아니면 A값으로, 둘다 NULL이면 NULL로
    COALESCE(T.DATE_COUNT,0) AS COUNT 
FROM 
    NUM N
    LEFT JOIN (
        SELECT HOUR(DATETIME) AS HOUR, COUNT(*) DATE_COUNT
        FROM ANIMAL_OUTS
        GROUP BY HOUR(DATETIME)) T
    ON N.HOUR = T.HOUR
ORDER BY
    HOUR ASC;

설명

처음 사용해보는 구문들이 많이 나오는 어려운 문제였습니다. 그만큼 얻어가는 것도 많은 문제입니다.😊
먼저 WITH RECURSIVE절입니다. 이는 재귀문으로 Python에서 For문, While문과 같은 기능을 합니다.
첫 문장은 첫번째 루프에서 실행되는 문장으로 반복되지 않지만 시작하는 문장입니다.
UNION ALL 다음으로 나오는 문장은 반복되는 문자로 WHERE절에서 언제까지 반복할 것인지 설정해줍니다.
이를 활용해 0시부터 23시까지 만들어주는 것이죠.

그렇다면 입양된 건이 없는 시간대에 0으로 채워주어야 합니다. 이때 COALESCE함수를 사용합니다. 이는 우선 순위가 있는 함수로, 표로 표현하면 다음과 같습니다:

그래서 이 문제에서는 COUNT열과 0을 가지고 함수를 사용하여 조건에 맞는 결과가 나오도록 하였습니다.

STRING, DATE: 루시와 엘라 찾기

⭐⭐

문제

동물 보호소에 들어온 동물 중

  • 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인
  • 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.

코드

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')

설명

NAME이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty 중 하나이어야 하므로 IN을 사용하여 필터링합니다.

profile
데이터에서 의사결정으로

0개의 댓글