데이터베이스를 다루다 보면, 단순히 행(Row)을 조회하는 것만으로는 충분하지 않을 때가 많습니다. 예를 들어, 부서별 평균 급여를 구하거나, 제품별 판매량 합계를 알고 싶다면, GROUP BY 구문과 집계 함수를 활용해야 합니다. 이번 글에서는 SQL에서 자주 쓰이는 GROUP BY 구문과 대표적인 집계 함수(aggregate functions)를 알아보겠습니다.
sql
코드 복사
SELECT 컬럼1, 집계함수(컬럼2)
FROM 테이블명
[WHERE 조건]
GROUP BY 컬럼1;
COUNT(*)는 해당 그룹(또는 전체 테이블)의 행 개수, COUNT(컬럼명)은 해당 컬럼에 NULL이 아닌 값의 개수를 센다는 차이가 있습니다.sql
코드 복사
SELECT Department, COUNT(*) AS dept_count
FROM employee
GROUP BY Department;
employee 테이블에서 부서(Department)를 기준으로 직원 수(dept_count)를 구함sql
코드 복사
SELECT Department, SUM(MonthlyIncome) AS total_income
FROM employee
GROUP BY Department;
SUM(컬럼)/COUNT(컬럼)과 동일한 개념sql
코드 복사
SELECT Department, AVG(MonthlyIncome) AS avg_income
FROM employee
GROUP BY Department;
sql
코드 복사
SELECT
Department,
MIN(Age) AS min_age,
MAX(Age) AS max_age
FROM employee
GROUP BY Department;
sql
코드 복사
SELECT Department, AVG(MonthlyIncome) AS avg_income
FROM employee
WHERE Age > 30
GROUP BY Department;
WHERE는 그룹화 전에 조건을, HAVING은 그룹화 후 조건을 적용sql
코드 복사
SELECT Department, AVG(MonthlyIncome) AS avg_income
FROM employee
GROUP BY Department
HAVING AVG(MonthlyIncome) > 6000;
ORDER BY를 추가sql
코드 복사
SELECT Department, COUNT(*) AS dept_count
FROM employee
GROUP BY Department
ORDER BY dept_count DESC;
dept_count)가 많은 부서부터 차례대로 내림차순으로 정렬| order_id | product_id | quantity | price | sale_date |
|---|---|---|---|---|
| 1 | P001 | 2 | 1000 | 2023-01-01 |
| 2 | P002 | 3 | 2000 | 2023-01-02 |
| 3 | P001 | 1 | 1000 | 2023-01-02 |
| 4 | P003 | 4 | 3000 | 2023-01-03 |
| ... | ... | ... | ... | ... |
sql
코드 복사
SELECT product_id, SUM(quantity) AS total_sold
FROM sales
GROUP BY product_id;
sql
코드 복사
SELECT sale_date, SUM(quantity * price) AS daily_revenue
FROM sales
GROUP BY sale_date;
sql
코드 복사
SELECT sale_date, SUM(quantity * price) AS daily_revenue
FROM sales
WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31'
GROUP BY sale_date
HAVING SUM(quantity * price) > 10000
ORDER BY daily_revenue DESC;
ONLY_FULL_GROUP_BY 모드가 꺼져 있으면 예외적으로 허용될 수도 있지만, 표준 SQL을 준수하는 것이 좋음AS 키워드를 사용하면 코드 가독성과 결과 확인이 편해짐 (예: AS total_income)COUNT(컬럼명)은 해당 컬럼이 NULL인 행을 제외COUNT(*)는 모든 행을 카운트GROUP BY와 집계 함수를 적절히 사용하면, 분석용 통계부터 일일·월별 보고서까지 다양한 정보를 뽑아낼 수 있습니다.
여기에 HAVING, ORDER BY, WHERE를 결합하여 조건 필터링과 정렬을 더하면, 좀 더 정교한 집계 결과를 얻을 수 있습니다.