SQL(프로그래머스) / GROUP BY(고양이와 개는 몇 마리 있을까, 동명 동물 수 찾기, 입양 시각 구하기(1), 입양 시각 구하기(2))
SQL(프로그래머스) / GROUP BY(고양이와 개는 몇 마리 있을까, 동명 동물 수 찾기, 입양 시각 구하기(1), 입양 시각 구하기(2))
https://programmers.co.kr/learn/courses/30/parts/17044
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
고양이와 개는 몇마리 있을까
문제 : 동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.
COUNT() : 그룹에 포함되는 데이터 개수
GROUP BY : 특정 칼럼 그룹화
ORDER BY : 정렬
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
ANIMAL_TYPE의 종류는 Cat과 Dog만 존재한다. GROUP BY로 ANIMAL_TYPE을 그룹화하고, ORDER BY를 통해 정렬한 후 COUNT를 출력할 수 있다.
동명 동물 수 찾기
문제 : 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
COUNT() : 그룹에 포함되는 데이터 개수
WHERE NAME IS NOT NULL : NULL이 아닐 때
GROUP BY : 특정 칼럼 그룹화
HAVING : 그룹화 조건문, 조건이 맞는 그룹 추출
ORDER BY : 정렬
SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME
WHERE문으로 NAME 중 NULL이 아닌 것들만 그룹화한다. 이름으로 그룹화한 것 중 COUNT가 2이 이상만 추출한 후 ORDER BY로 이름 순으로 정렬한다.
입양 시각 구하기(1)
문제 : 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
HOUR() : 시간 추출
COUNT() : 그룹에 포함되는 데이터 개수
WHERE : 테이블 조건문
GROUP BY : 특정 칼럼 그룹화
ORDER BY : 정렬
시간 이외에도 연도, 월, 일 등 다앙한 값을 추출할 수 있다.
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >=9 AND HOUR(DATETIME) <=19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR
HOUR을 이용하여 시간을 추출할 수 있다. WHERE문으로 HOUR의 9시부터 19시까지만 추출하는 조건문을 걸어주고 GROUP BY로 시간별 그룹화 해준다. 데이터를 정렬하기 위해 ORDER BY를 사용해준다.
입양 시각 구하기(2)
문제 : 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SET : 변수 선언
HOUR() : 시간 추출
COUNT() : 그룹에 포함되는 데이터 개수
WHERE : 테이블 조건문
변수 선언
SET @(변수명) := 값;
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을 통해 @HOUR 변수 선언을 해준다. 쿼리문에서 변수를 활용하여 0시부터 23시를 모두 조회해야 한다.
@HOUR은 +1씩 증가하고, WHERE 조건문에서 HOUR(DATETIME)에서 얻은 시간과 변수 @HOUR와 같은 시간을 세어 준다.
변수 @HOUR가 0시부터 23시까지 조회할 수 있다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/008.gif)