동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.
SELECT ANIMAL_TYPE, COUNT(*)
FROM ANIMAL_INS
GROUP BY 1 -- 테이블의 레코드를 그룹핑, 1은 SELECT문에서 첫번째 필드(ANIMAL_TYPE)
ORDER BY 1; -- 고양이 먼저 조회(D보다 C먼저)
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
GROUP BY 1 -- NAME으로 그룹핑
HAVING COUNT(NAME) >= 2 -- 그룹에 조건 추가
ORDER BY 1; -- NAME 오름차순 정렬
GROUP으로 묶은 후 GROUP에 조건을 줄때는 WHERE절이 아니라 HAVING절을 사용해야한다.
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(1) AS 'COUNT' -- DATETIME의 타입 변환
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19 -- 9시~19시까지
GROUP BY 1 -- HOUR(DATETIME)으로 그룹핑
ORDER BY 1; -- 시간대 오름차순 정렬
AS절은 필드명이나 테이블의 이름을 다시 지을 때 사용한다.
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SET @hour := -1;
SELECT (@hour := @hour+1) as HOUR,
(SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME)=@hour) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE @hour < 23
이 문제 ... 정말 너무 어렵게 풀었던 문제다. 고민해보다가 구글 검색해서 푸는 방법을 알아냈다. 참고했던 블로그 👍
SET
이라는 걸 새롭게 배울 수 있었다. SET
은 어떤 변수를 정의하고 특정 값을 할당할 수 있다.
=
은 sql에서 대입연산자, 비교연산자로 쓰일 수 있어서 대입 연산자로만 쓰이는 :=
로 값을 할당해준다.
그리고 밑에 WHERE문으로 조건을 정한 후 SELECT문에서 WHILE문처럼 도는 방식이다. 값을 1씩 늘려주면서 DATETIME의 HOUR와 비교해 COUNT해준다.
@hour
에 -1을 대입
해준 뒤 +1씩
늘려가므로 0부터 시작해서 22(<23)까지 실행
되어서 22+1인 23까지
COUNT값을 조회하게 된다.
프로그래머스의 SQL고득점Kit를 풀면서 가장 어려웠던 문제가 바로 GROUP BY의 4번째 문제 입양 시각 구하기(2)였다. 문제들을 풀면서 개념들을 복습할 수 있었지만 문제가 좀 더 많았으면 하는 바램이 있다...ㅎㅎ
그리고 문제의 정답이 여러개 있겠지만 가장 짧고 가독성이 좋은 코드를 짜기 위해서는 많은 문법들을 알고 사용할 수 있어야 한다는 것을 다시 한번 깨달았다.