[프로그래머스 SQL 코딩테스트 연습] Lv4. 입양 시각 구하기 (2) (MySQL)
🤔 문제
`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/
[SET 문법 참고]
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EB%B3%80%EC%88%98