[SQL] 프로그래머스 SQL 고득점 kit (4)

이정진·2021년 9월 28일
0

SQL

목록 보기
4/23
post-thumbnail

고양이와 개는 몇 마리 있을까

SQL 구분 : GROUP BY, ORDER BY

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

문제 풀이

group by는 그룹으로 묶겠다는 의미이다.
문제에서 고양이와 개가 각각 몇 마리인지를 찾아라, 즉 ANIMAL_TYPE을 그룹으로 묶어서 조회하라는 의미가 되므로, group by ANIMAL_TYPE을 사용하였으며, 여기서 고양이를 개보다 먼저 조회해야 하기 때문에 group by 뒤에 order by ANIMAL_TYPE asc를 통해서 순서를 정했다.

SQL

SELECT ANIMAL_TYPE, count(ANIMAL_TYPE) as count
from ANIMAL_INS
group by ANIMAL_TYPE order by ANIMAL_TYPE asc

동명 동물 수 찾기

SQL 구분 : GROUP BY, HAVING, ORDER BY

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

문제 풀이

처음엔 아무 생각 없이 where절로 조건을 주려고 하였지만, group으로 묶은 후에는 group에 조건을 줄때는 where절이 아니라 having절을 사용하여야 한다는 것을 잊고 있었다.
그래서 having절을 통해서 count(NAME) > 1 조건을 걸어주고, 이름 순 정렬이 필요해 order by 역시 작성했다.

SQL

SELECT NAME, count(NAME) as COUNT
from ANIMAL_INS 
group by NAME having count(NAME) > 1 order by NAME asc

입양 시각 구하기(1)

SQL 구분 : GROUP BY, HAVING, ORDER BY, HOUR

문제

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

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

문제 풀이

sql에서 hour함수는 type이 datetime 즉, 날짜 데이터에서 일부만을 추출할 때 사용하는 함수로, 여기서 hour을 기준점으로 삼아 구분해달라고 하였기에 해당 함수를 사용해서 문제를 풀면 된다.

SQL

SELECT HOUR(DATETIME) as HOUR, count(HOUR(DATETIME)) as COUNT
from ANIMAL_OUTS
group by HOUR
having 9 <= HOUR and HOUR < 20
order by HOUR asc

입양 시각 구하기(2)

SQL 구분 : SET

문제

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

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

문제 풀이

일반적으로 select HOUR(DATETIME) as HOUR을 활용해서 진행하면, DB에 존재하는 값들로만 조회가 되기 때문에, NULL값을 가지는 시간대에 대해 출력되지 않는다.
이를 조회하기 위해서는 변수 선언을 통해서 해결해야 한다.
변수 선언 방법은 set @hour := -1; 이다.
set은 변수 선언용 함수이며, 비교연산자인 =과 구분하기 위하여 :=을 통해서 해당 변수의 값을 지정하였으며, 변수 선언 시 마지막에 ';'을 작성하여야 한다.
@변수명과 같이 선언을 해주어야 한다. 그래야 프로시저가 종료되어도 해당 변수를 유지할 수 있다고 한다.
마지막의 where @hour < 23에서 @hour <= 23이 아닌 이유는, @hour가 22일 때, 위의 select문이 진행되어 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

0개의 댓글