취업준비/코딩테스트 문제 풀이

[프로그래머스 SQL 코딩테스트 연습] Lv4. 입양 시각 구하기 (2) (MySQL)

상급닌자연습생 2024. 6. 17. 12:17

🤔 문제

`ANIMAL_OUTS` 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. `ANIMAL_OUTS` 테이블 구조는 다음과 같으며, `ANIMAL_ID`, `ANIMAL_TYPE`, `DATETIME`, `NAME`, `SEX_UPON_OUTCOME`는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

 

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

 

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

 

 

 

 

 

 


💻 나의 풀이 (오답)

SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 0 AND 23
GROUP BY HOUR(DATETIME)
ORDER BY 1;

 

 

 

 

결과

 

 

 

 

 

 


🖍 오답노트

틀린 이유

`SET` 문법을 알지 못해서 틀렸다.

해당 시간대에 입양된 동물이 없어도 무조건 0시부터 23시까지 `HOUR` 컬럼값을 전부 출력해야 하는데,

`WHERE` 절로 `BETWEEN`조건을 걸게될 경우, 위의 실행 결과처럼 0시부터 23시 사이에 있는 '값이 존재하는' 시간대만 출력된다.

 

 

 

 

정답 풀이

SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS HOUR, 
    (SELECT COUNT(HOUR(DATETIME))
    FROM ANIMAL_OUTS
    WHERE HOUR(DATETIME) = @HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;

 

📌 사용자 정의 변수 설정

1) `SET @HOUR = -1;` : `HOUR`변수에 먼저 -1을 할당하여 초기화한 후,

2) `WHERE @HOUR < 23;` : `HOUR` 변수가 22가 될 때 까지

3) `SELECT (@HOUR := @HOUR + 1) AS HOUR` : `HOUR` 변수에 1씩 더해준다.

 

► 처음 `HOUR`변수는 -1로 시작했지만 맨 마지막 줄의 `WHERE`절 조건 덕분에 +1씩 더해져서 0시부터 23시까지 출력할 수 있게 된다.

 

 

 

 

 

 

 


✅ 핵심 정리

1. 사용자 정의 변수 설정 SET

-- 기본 구조

SET @변수이름 := 초기화값;
-- 또는 아래와 같이 써도 동일한 문법이다.
SET @변수이름 = 초기화값;

-- SET 이외의 명령문
SELECT @변수이름 := 대입값;
  • `SET`에서 값을 할당하기 위해서는 `=` 혹은 `:=`를 사용한다.
  • `SET` 이외의 쿼리문에서는 `=`가 비교연산자로 취급되므로 `:=`를 사용한다.
  • 초기값으로 저장하는 값에 의해 자료형이 정해진다.
    • 가능한 자료형 : Integer, Decimal, Float, Binary, String
    • 변수를 초기화하지 않은 경우 : String (값은 NULL)
  • `@`가 붙은 변수는 프로시저(procedure)가 종료되어도 유지된다.

 

 

 

 

 

 


🔗 References

[정답 풀이 참고]

https://chanhuiseok.github.io/posts/db-6/

 

[프로그래머스] 입양 시각 구하기(1), (2) (GROUP BY, HAVING, SET)

[프로그래머스] 입양 시각 구하기(1), (2)

chanhuiseok.github.io

 

 

 

[SET 문법 참고]

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EB%B3%80%EC%88%98

 

[MYSQL] 📚 변수 종류 정리 (사용자 변수 / 지역 변수 / 시스템 변수)

사용자 정의 변수 사용자 정의 변수 선언 및 초기화 SET @변수이름 = 대입값; -- or SET @변수이름 := 대입값; SELECT @변수이름 := 대입값; ​SET 이외의 명령문에서는 = 가 비교연산자로 취급되기 때문에

inpa.tistory.com