[코딩 자율학습 14기] SQL 데이터베이스 입문 8장

안지원·2025년 5월 3일

SQL

목록 보기
8/10

8장. 그룹화 분석하기

  • 데이터를 분석할 때 단순히 데이터를 나열한 상태로 분석하기엔 충분하지 않은 경우가 있습니다.
  • 특정 기준에 따라 데이터를 분류하고 데이터를 분석하면 좀 더 풍부한 인사이트를 얻을 수 있습니다.
  • 이 글에선 데이터를 그룹으로 나누고 집계하는 방법인 그룹화 분석에 대해 알아보겠습니다.

📗 그룹화

📌 그룹화란?

  • 그룹화란 데이터 분석 기법의 하나로, 데이터를 특정 기준에 따라 여러 그룹으로 나누고 그룹별 데이터를 요약하거나 분석하는 것입니다.
  • 복잡한 데이터 사이에서 유의미한 패턴을 찾거나 특정 변수에 따른 행동이나 특성을 더 잘 이해하기 위해 수행합니다.

students 테이블 생성

학생들의 평균 키 구하기

📌 그룹화 (GROUP BY)

  • GROUP BY절은 특정 칼럼을 기준으로 데이터를 그룹화하는 문법입니다.
SELECT 그룹화_칼럼, 집계_함수(일반_칼럼)
FROM 테이블명
WHERE 조건
GROUP BY 그룹화_칼럼

남자와 여자 각각 평균 키 구하기

  • where 필터링 조건은 선택사항입니다.
  • 이렇게 GROUP BY를 활용해 그룹화한 데이터를 집계함수(COUNT, SUM, AVG, MIN, MAX 등)을 이용해 계산함으로써 각종 요약 정보를 쉽게 뽑아낼 수 있습니다.

📌 그룹화의 특징

  • GROUT BY절은 다음 3가지 특징이 있습니다.

1. 집계 함수와 함께 사용해야 한다.

  • GROUP BY절은 하나 이상의 집계함수와 함께 사용해야 의미가 있습니다.
  • 단순히 GROUP BY절만 사용하면 데이터를 그룹으로 묶기만 합니다.
  • 유의미한 데이터 분석 결과를 얻으려면 집계작업을 거쳐야합니다.
  • 단순히 남자, 여자 분리해서 보고싶다고 하신다면 GROUP BY만 사용할 수 있긴 합니다.

2. 여러 칼럼으로 그룹화할 수 있다.

  • GROUP BY절로 데이터를 그룹화할 때 2개 이상의 칼럼을 기준으로 그룹화 할 수 있습니다.
  • 이 경우 각 칼럼 조합에 따라 고유한 그룹이 형성됩니다.
SELECT 그룹화_칼럼1, 그룹화_칼럼2, 집계_함수(일반_칼럼)
FROM 테이블명
WHERE 조건
GROUP BY 그룹화_칼럼1, 그룹화_칼럼2;

  • 예시로 다음과 같은 sales 테이블에서
  1. city(특정 도시)를 기준으로 그룹화한 후
  2. 다시 sale_date(판매 연도)를 기준으로 세부 그룹을 나누어
  3. 특정 도시의 연도별 총 매출을 집계해봅시다.

3. SELECT절에 올 수 있는 칼럼이 제한적이다

  • GROUP BY로 그룹화한 쿼리의 SELECT절에 올 수 있는 칼럼은 GROUP BY절에서 지정한 그룹화 칼럼이거나, 집계함수이어야 합니다.
  • 그룹화 칼럼이나 집계함수가 아닌 다른 값을 SELECT하려고 하면 에러가 발생합니다.
  • 예를 들어 아래 사진처럼 gender을 그룹화한 칼럼에서 그룹화에 포함되지도 않고, 집계함수도 아닌 height을 SELECT하려고 하면 에러가 발생합니다.

📗 그룹화 필터링, 정렬, 조회 개수 제한

📌 그룹화 필터링(HAVING)

  • 그룹화 필터링이란 그룹화한 결과에서 특정 조건을 만족하는 그룹의 데이터만 가져오는 것입니다.
  • 예를 들어 성별로 그룹화한 후 평균 키가 170이 넘는 데이터만 가져온다거나, 결제 유형별로 그룹화한 후 결제 금액이 5만원이 넘는 데이터만 가져오는 등의 상황에서 그룹 필터링을 사용합니다.
  • 그룹화 필터링은 GROUP BY절에 HAVING절을 추가해 수행합니다.
  • HAVING절은 GROUP BY로 나눈 그룹에 필터링 조건을 거는 역할을 합니다.
SELECT 그룹화_칼럼, 집계_함수(일반_칼럼)
FROM 테이블명
WHERE 일반_필터링_조건
GROUP BY 그룹화_칼럼
HAVING 그룹_필터링_조건;
  • 새로 payments 테이블을 만들어 그룹화 필터링 실습을 진행하겠습니다.

ptype별로 그룹화하고, 평균 결제 금액이 40000원 이상인 데이터 조회하기

📌 HAVING절과 WHERE절 차이

  • HAVING절은 WHERE절과 비슷하게 작동하는 듯 보이지만 실제로 차이가 있습니다.
  • WHERE절은 개별 튜플에 대해 필터링을 수행하지만 HAVING절은 그룹화한 결과, 즉 그룹 단위로 필터링을 수행합니다.
  • WHERE은 튜플 하나에 대해서만 필터링을 수행합니다.
  • HAVING은 그룹화한 절 안에 있는 튜플들을 통해 필터링을 수행하게 됩니다.

📗 정렬

📌 정렬(ORDER BY)

  • 정렬이란 쿼리 결과의 데이터를 오름차순 또는 내림차순으로 배열하는 것입니다.
  • SQL에서 특정 칼럼을 중심으로 정렬할 때는 ORDER BY절을 사용합니다.
  • ORDER BY절엔 뒤에 붙는 ASCDESC 키워드가 존재합니다.
  • 이 키워드를 통해 결과를 오름차순 정렬할지 내림차순 정렬할지 정할 수 있습니다.

    ASC, DESC
    ASC : 오름차순
    DESC : 내림차순

SELECT *
FROM 테이블명
WHERE 조건
ORDER BY 정렬_칼럼1 [ASC || DESC], 정렬_칼럼2 [ASC || DESC]..;

단일 칼럼으로 정렬하기

  • payments 테이블에서 결제 금액이 높은 순서대로 데이터를 조회해봅시다

다중 칼럼으로 정렬하기

  • 정렬은 2개 이상의 칼럼으로 기준을 잡을수도 있습니다.
  • ptype의 오름차순으로 정렬한 후, 결제 유형이 같은 데이터를 다시 amount의 내림차순으로 정렬해봅시다.

📌 조회 개수 제한(LIMIT)

  • 조회 개수 제한은 상위 N개 튜플을 조회할 때 사용하는 명령입니다.
  • LIMIT절을 이용해 반환하려는 튜플의 개수 N을 정의합니다.
SELECT 칼럼1, 칼럼2, ...
FROM 테이블명
LIMIT N;
  • payments 테이블에서 amount의 내림차순으로 정렬하고 상위 3개 데이터만 조회해봅시다.

LIMIT 시작점 정하기(OFFSET)

  • 만약 상위 튜플이 아닌 중간튜플을 가져오고싶다면 LIMIT절에 OFFSET 키워드를 추가해 읽어 올 데이터의 시작 지점을 조정할 수 있습니다.
SELECT 칼럼1, 칼럼2, ...
FROM 테이블명
LIMIT N OFFSET M; 
-- N : 가져올 튜플의 개수, M : 건너뛸 튜플의 개수
  • amount의 상위 4~6등 까지의 데이터를 구해봅시다.

📌 마켓 DB 만들어서 그룹화 실습하기

  • 깃허브에 코드를 제공해주는걸 이제야 알았습니다..😅
  • 이제 손가락이 덜 아프겠군요

📌 데이터셋 만들기

상품 유형별 집계하기

  • products 테이블을 product_type별로 나눠 유형별 상품 개수, 최고 가격, 최저 가격을 구해봅시다.

사용자별 주문 총액 필터링하기

  • 사용자별 주문 총액을 구해 주문 총액이 30,000원 이상인 주문자만 조회해봅시다.

가장 많이 팔린 상품 TOP3 찾기

  • 상품별 판매 수량을 집계해 가장 많이 팔린 상품 TOP3를 조회해 봅시다.
  • 판매완료가 아닌 장바구니에 담긴 상품은 취급하지 않습니다.
profile
frontend개발자가 되기 위해 노력합니다.

0개의 댓글