코딩테스트/SQL

[SQL고득점Kit] 프로그래머스 GROUP BY, IS NULL

PONI 2023. 5. 9. 16:12
반응형

📌GROUP BY

group by는 having이랑 짝꿍이다. group by (    attribute    ) 로 원하는 attribute 값들끼리 그룹화된다. 각 그룹 내에서 조건문으로 필터링을 하고 싶다면 having을 사용하는 방식이다. 

1. 고양이와 개는 몇 마리 있을까 - COUNT, GROUP BY

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

SELECT ANIMAL_TYPE, COUNT(*) as count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;

2. 동명 동물 수 찾기 - GROUP BY & HAVING

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

* sql 실행 순서 : where → group by → having

SELECT NAME, COUNT(*) as COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME ASC;

3. 입양 시각 구하기(1)

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

SELECT hour(datetime) as HOUR, count(hour(datetime)) as COUNT
FROM animal_outs
GROUP BY hour
HAVING hour between 9 and 19
ORDER BY hour;

4. 입양 시각 구하기(2)

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

* group by로만 풀고 싶었는데 느낌상 그러면 안될 거 같았다. 찾아보니 recursive 쓰거나 set 변수 쓰는 게 있었는데 난 아무래도 재귀는 어려워서 set 변수 사용으로 했다. SET은 일반적인 프로그래밍에서 변수를 선언하는 예약어로 @hour := 1; 과 같이 선언해준다. 제어해주는 코드가 없으면 계속 hour는 k씩 증감 하게 되므로 WHERE 절에서 @hour < 23 반복조건문을 추가해줬다. 해보면 간단한데 SET 변수 자체를 모르고 있어서 못 푼 문제였다.

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;

 

📌IS NULL

 

where이나 having과 같은 조건을 다루는 곳에서 IS NULL, IS NOT NULL로 사용된다. 직관적으로 특정 attribute 값이 null인 레코드, null이 아닌 레코드를 의미한다.

1. 이름이 없는 동물의 아이디 - IS NULL

동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID ASC;

2. 이름이 있는 동물의 아이디 - IS NOT NULL

동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;

3. NULL 처리하기 - COALESCE/IFNULL

입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 No name으로 표시해 주세요.

#mysql - IFNULL
SELECT animal_type, IFNULL(name, "No name"), sex_upon_intake
FROM ANIMAL_INS;

#all DBMS - COALESCE
SELECT animal_type, COALESCE(name, "No name"), sex_upon_intake
FROM ANIMAL_INS;
반응형