오늘은 지난 프로그래머스 SQL 1단계에 이어서 2단계를 풀어보았다. 생각보다 어려웠다. 1단계를 풀때는 아~ 이런게 있구나~ 쉽네~ 하면서 했기 때문에 이번에 조금 당황했다. GROUP BY는 처음에 내 생각 처럼 움직여주지 않았다.
SELECT * FROM 테이블명 GROUP BY 그룹핑 할 기준 칼럼명
그룹 파이는 다음과 같은 형식으로 쓴다. 처음엔 잘 이해가 가지 않았다. 뭘 어떻게 하라는거지? 라는 생각이 들었다.
일단 간단한 문제를 보면서 적용하면서 이해해 보자.
데이터는 이전과 동일한 프로그래머스에 있는 동물 정보 데이터를 사용한다.
<문제링크 - https://programmers.co.kr/learn/courses/30/lessons/59040>
NAME | TYPE | NULLABLE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
다음과 같이 데이터가 존재 할 때 저 데이터에서 동물의 타입별로 몇 마리가 있는지 체크해 주어야 하는게 우리의 목적이다.
ANIMAL_TYPE | count |
---|---|
Cat | 2 |
Dog | 1 |
다음과 같은 형식으로 말이다. 이것을 실현시키기 위해서는 GROUP BY와 COUNT를 사용해주어야 한다. 둘은 짝꿍이라고 한다.
기본 문법은 다음과 같다.
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
내 코드를 살펴보면 다음과 같다.
SELECT ANIMAL_TYPE, COUNT(*) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
COUNT()에 대해서 내가 잘못알고 있는 것이 있다면 댓글을 바랍니다.
count에 대한 내용은 https://www.sqltutorial.org/sql-aggregate-functions/sql-count/ 이 링크에서 찾아볼 수 있다. sql 튜토리얼을 알려주는 사이트인데 정리가 잘 되어 있다고 생각된다.
다시 돌아와서, 저런 식으로 count와 group by를 한 세트로 써주게 되면 동물에 타입에 따른 동물의 수라는 결과를 얻을 수 있다.
두번째 문제의 링크는 다음과 같다.
https://programmers.co.kr/learn/courses/30/lessons/59041
NAME | COUNT |
---|---|
Lucy | 3 |
Raven | 2 |
이름 중에서 이름이 2번 이상 나온 데이터만 출력해 주어야 하는 문제이다.
어떻게 해야 cnt에 조건을 걸 수 있을까?
이 문제도 새로운 문법으로 풀어야 한다. 바로 HAVING이다.
이것도 어떻게 할지 몰라서 일단 구글링을 해봤다. 그랬더니 또 좋은 사이트를 찾았다.
https://www.w3schools.com/sql/sql_having.asp
예전에 파이썬 처음 공부할 때 유용하게 쓴 사이트를 다시보니 반가웠다.
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
기본적인 문법은 다음과 같다고 한다. 문제에 맞추어 이를 적용해보면
SELECT NAME, COUNT(NAME) as cnt
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING cnt >= 2
ORDER BY NAME
이런식으로 쓸 수 있다.
HAVING으로 내가 카운트하는 것에 대해 조건을 걸 수 있다. 이것을 사용하게 되면 카운트가 2이상인 정보만 출력 될 것이다.
GROUP BY로 데이터를 묶어서 쓸 수 있다. 또한 HAVING으로 조건을 걸어줄 수도 있다.
문법은
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
요렇게 써준다.