12/18 일지 - SQL 변수선언
SQL 카타
73. 입양 시각 구하기(2)
1)변수 선언 및 서브쿼리
2)재귀함수
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
-오답
select hour(datetime) hour,
count(*) count
from animal_outs
group by hour
order by hour
문제와 예시를 보자마자 호기롭게 group by 함수를 사용. 하지만 level4인데 그렇게 간단하고 쉬울 문제가 나올 리 없지 보기 좋게 틀려버렸다. 문제에서는 0시부터 23시까지의 테이블이 포함된 데이터를 정렬해 달라고 했으나, group by로는 실제 데이터가 있는 7시 경부터의 자료만 조회가 됐다. 즉, group by로 그룹화 해서 테이블로 출력해낼 수 있는 것은 실제 데이터(케이스)가 있는 경우일 뿐이었다.
1)변수 선언 및 서브쿼리
set @hours = -1; #-1을 hours에 할당
select
(@hours := @hours+1) hours, #@hours+1을 @hours에 할당. 즉, 0부터 시작.
(select count(*) ##set 함수를 제외한 곳의 변수 할당은 ":="로 할 것('='는 비교연산자)
from animal_outs
where hour(datetime)=@hours) count #datetime의시간이 위의 @hours와 일치하는 곳을 카운트
from animal_outs
where @hours < 23 #@hours의 최대치를 23미만으로 설정. 위의 내용에 따라 테이블에서의 최대치는 23
그러면 어떻게 풀면 될 지 고민하면서 아무리 짱구를 굴려봐도 답이 안 나와서 '질문하기'를 들어가보고, 추가로 구글링을 해보니 주로 나온 것은 재귀함수와 변수 선언. recursive는 시간도 늦은 데다가 내용이 어려우니 내일 추가로 공부하고 정리하기로 하고 우선 변수 선언부터 정리했다.
변수 선언 방법은 파이썬에서 하는 것과 다를 바 없이 필요한 특정 임의의 값을 설정해주는 걸로, 이를 기반으로 테이블을 만들어주기만 하면 된다. 이번 문제의 경우 0시부터 23시까지의 자료를 만드는 것이니 그에 맞게 0부터 23까지의 행들을 만들어주고, 그에 맞게끔 케이스들을 카운트하기만 해주면 되는 문제였다.
구체적으로 코드를 입력하는 방법만 처음이라 익숙하지 않아서 그렇지, 처음에 -1을 할당하는 것에서 시작해서 23미만으로 값을 잡아줘야한다는 점 빼고 전체적인 구조는 어렵지 않으니 꾸준히 복습만 하면 되는 유형인 것 같다.
정리 : 변수선언
1)SET과 @(변수명) 입력
2)SET을 통해 처음 변수 선언해줄 시에만 '=' 사용, 나머지 경우엔 모두 ':='사용할 것!
3)where절을 통해 변수의 최대치 설정