[프로그래머스 SQL] GROUP BY

파이톨치·2022년 1월 25일
1
post-thumbnail

GROUP BY

오늘은 지난 프로그래머스 SQL 1단계에 이어서 2단계를 풀어보았다. 생각보다 어려웠다. 1단계를 풀때는 아~ 이런게 있구나~ 쉽네~ 하면서 했기 때문에 이번에 조금 당황했다. GROUP BY는 처음에 내 생각 처럼 움직여주지 않았다.

SELECT * FROM 테이블명 GROUP BY 그룹핑 할 기준 칼럼명

그룹 파이는 다음과 같은 형식으로 쓴다. 처음엔 잘 이해가 가지 않았다. 뭘 어떻게 하라는거지? 라는 생각이 들었다.

첫번째 문제

일단 간단한 문제를 보면서 적용하면서 이해해 보자.

데이터는 이전과 동일한 프로그래머스에 있는 동물 정보 데이터를 사용한다.
<문제링크 - https://programmers.co.kr/learn/courses/30/lessons/59040>

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE

다음과 같이 데이터가 존재 할 때 저 데이터에서 동물의 타입별로 몇 마리가 있는지 체크해 주어야 하는게 우리의 목적이다.

ANIMAL_TYPEcount
Cat2
Dog1

다음과 같은 형식으로 말이다. 이것을 실현시키기 위해서는 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

NAMECOUNT
Lucy3
Raven2

이름 중에서 이름이 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);

요렇게 써준다.

profile
안알랴줌

0개의 댓글