⭐
FISH_INFO 테이블에서
-- 코드를 작성해주세요
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 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
합니다.
⭐⭐
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
-- 코드를 입력하세요
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
를 사용하여 시간대별 입양 건수를 구합니다.
⭐⭐⭐⭐
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
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을 가지고 함수를 사용하여 조건에 맞는 결과가 나오도록 하였습니다.
⭐⭐
동물 보호소에 들어온 동물 중
-- 코드를 입력하세요
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
을 사용하여 필터링합니다.