본문 바로가기

Server/DB

코테 준비를 위한 SQL 첫걸음 정리 - 집계함수, GROUP BY

1. 집계 함수 기본 개념

  • 집계 함수란
    데이터 집합에 대해 계산을 수행하여 단일 결과를 반환하는 함수이다.
  • 주요 집계 함수
    • COUNT: 행의 개수를 계산한다. (NULL 값은 제외됨)
      • DISTINCT: 중복된 데이터는 계산하지 않는다. COUNT(DISTINCT 칼럼) 
    • SUM: 합계를 계산한다. (NULL 값은 제외됨)
    • AVG: 평균값을 계산한다. (NULL 값은 제외됨)
    • MIN: 최솟값을 반환한다.
    • MAX: 최댓값을 반환한다.

 

2. 집계 함수가 사용될 수 있는 곳

  1. FROM
    • 데이터 원본(테이블 등)을 결정.
  2. WHERE
    • 그룹화 이전에 개별 행을 필터링
    • 집계 함수가 개별 행에 대해 즉시 계산되는 것이 아니라, 그룹화 이후에 계산 됨 -> 집계 함수 사용 불가.
    • 서브쿼리 내부에서 집계 함수가 사용될 수 없다는 말은 아님.
  3. GROUP BY
    • 지정한 칼럼 기준으로 데이터를 그룹화.
  4. HAVING
    • 그룹화된 결과를 대상으로 필터링.
    • 집계 함수 사용 가능.
  5. SELECT
    • 최종 결과를 선택.
    • 집계 함수 사용 가능.
  6. ORDER BY
    • 결과를 정렬.
    • 집계 함수 사용 가능.

예제 쿼리:

SELECT name, COUNT(name)
FROM 테이블명
WHERE 조건식
GROUP BY name
HAVING COUNT(name) = 1
ORDER BY COUNT(name);

 

3. GROUP BY 사용법

  • 기본 사용법
    GROUP BY는 지정한 칼럼을 기준으로 데이터를 그룹화하고, 각 그룹별로 집계 함수를 적용할 수 있다.

기본 구문:

SELECT 그룹화_칼럼, 집계함수(칼럼)
FROM 테이블명
GROUP BY 그룹화_칼럼;
  • 예제: sales 테이블의 카테고리별 총합 계산
id category amount
1 A 100
2 B 200
3 A 300
4 B 400
5 C 500
SELECT category, SUM(amount) AS total_amount
FROM sales
GROUP BY category;

 

category total_amount
A 400
B 600
C 500
  • 주의 사항
    GROUP BY에 포함되지 않은 칼럼은 SELECT 절에서 집계 함수 없이 사용할 수 없다.

잘못된 예:

SELECT 칼럼1, SUM(칼럼2)
FROM 테이블명
GROUP BY 칼럼3;
 

올바른 예:

SELECT 칼럼2, SUM(칼럼1)
FROM 테이블명
GROUP BY 칼럼1;

 

4. HAVING과 WHERE의 차이

  • WHERE 절
    • 그룹화 이전에 개별 행을 필터링한다.
    • 집계 함수 사용 불가.
  • HAVING 절
    • 그룹화 이후에 그룹별 결과를 필터링한다.
    • 집계 함수 사용 가능.

예제:

SELECT category, SUM(amount) AS total_amount
FROM sales
GROUP BY category
HAVING SUM(amount) >= 500;

 

category total_amount
B 600
C 500

 

5. 다중 칼럼 GROUP BY

  • 다중 칼럼 그룹화
    다중의 칼럼의 값이 동일한 행들끼리 그룹화가 진행된다.

예제: orders 테이블

order_id customer_id product_id quantity
1 A 101 3
2 A 102 5
3 A 101 2
4 B 101 4
5 B 103 1
6 C 102 7
SELECT customer_id, product_id, COUNT(*) AS total_orders
FROM orders
GROUP BY customer_id, product_id;

 

customer_id product_id total_orders
A 101 2
A 102 1
B 101 1
B 103 1
C 102 1