SQL Group By
SQL GROUP BY: 데이터를 그룹별로 집계
SQL GROUP BY 절은 SELECT 문에서 데이터를 특정 열의 값에 따라 그룹화하고, 각 그룹에 대한 집계 결과를 반환할 때 사용됩니다. 주로 COUNT(), SUM(), AVG(), MAX(), MIN() 같은 집계 함수와 함께 사용되어 데이터를 요약하거나 분석할 때 매우 유용합니다.
1. 기본 GROUP BY 문법
SELECT 열이름, 집계함수(열이름)
FROM 테이블이름
WHERE 조건
GROUP BY 열이름;
- 열이름: 데이터를 그룹화할 기준이 되는 열.
- 집계함수: 그룹별로 계산할 집계 함수 (예: COUNT, SUM, AVG 등).
- GROUP BY: 데이터가 그룹화되는 열을 지정.
2. SQL GROUP BY 예제
2.1 부서별 직원 수 계산
다음은 employees
테이블에서 부서별로 직원 수를 계산하는 예제입니다.
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
이 쿼리는 각 부서의 직원 수를 반환합니다.
결과 예시:
department | employee_count |
---|---|
Sales | 3 |
HR | 2 |
Engineering | 4 |
2.2 부서별 평균 급여 계산
다음은 각 부서의 평균 급여를 계산하는 예제입니다.
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
이 쿼리는 부서별로 직원들의 평균 급여를 반환합니다.
결과 예시:
department | avg_salary |
---|---|
Sales | 5000 |
HR | 5500 |
Engineering | 6000 |
3. GROUP BY와 HAVING 절 사용
HAVING 절은 GROUP BY 결과에 조건을 설정할 때 사용됩니다. WHERE 절과 유사하지만, WHERE는 개별 행에 조건을 걸고, HAVING은 그룹화된 데이터에 조건을 적용합니다.
예제: 직원 수가 3명 이상인 부서만 조회
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) >= 3;
이 쿼리는 직원 수가 3명 이상인 부서만 반환합니다.
결과 예시:
department | employee_count |
---|---|
Sales | 3 |
Engineering | 4 |
4. GROUP BY와 여러 열 결합
GROUP BY는 여러 열을 기준으로 그룹화할 수 있습니다. 이를 통해 더 세밀한 그룹을 생성할 수 있습니다.
예제: 부서별, 직급별 직원 수 계산
SELECT department, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title;
이 쿼리는 부서별로 직급을 나누어 직원 수를 계산합니다.
결과 예시:
department | job_title | employee_count |
---|---|---|
Sales | Manager | 1 |
Sales | Salesperson | 2 |
HR | Manager | 1 |
HR | Assistant | 1 |
Engineering | Engineer | 3 |
Engineering | Manager | 1 |
5. GROUP BY와 정렬 (ORDER BY)
GROUP BY 결과를 ORDER BY 절을 사용해 정렬할 수 있습니다. 정렬은 집계 결과나 그룹화된 열을 기준으로 할 수 있습니다.
예제: 부서별 직원 수를 내림차순으로 정렬
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
ORDER BY employee_count DESC;
이 쿼리는 직원 수가 많은 부서부터 내림차순으로 결과를 반환합니다.
결과 예시:
department | employee_count |
---|---|
Engineering | 4 |
Sales | 3 |
HR | 2 |
6. GROUP BY와 집계 함수
GROUP BY는 다양한 집계 함수와 함께 사용할 수 있습니다. 대표적인 집계 함수는 다음과 같습니다:
- COUNT(): 그룹의 개수를 반환합니다.
- SUM(): 그룹의 합계를 반환합니다.
- AVG(): 그룹의 평균값을 반환합니다.
- MAX(): 그룹에서 최대값을 반환합니다.
- MIN(): 그룹에서 최소값을 반환합니다.
예제: 부서별로 급여 합계, 평균, 최대값, 최소값 조회
SELECT department, SUM(salary) AS total_salary, AVG(salary) AS avg_salary,
MAX(salary) AS max_salary, MIN(salary) AS min_salary
FROM employees
GROUP BY department;
이 쿼리는 각 부서의 급여 합계, 평균, 최대값, 최소값을 반환합니다.
결과 예시:
department | total_salary | avg_salary | max_salary | min_salary |
---|---|---|---|---|
Sales | 15000 | 5000 | 6000 | 4000 |
HR | 11000 | 5500 | 6000 | 5000 |
Engineering | 24000 | 6000 | 7000 | 5000 |
7. GROUP BY와 NULL 값 처리
GROUP BY 절에서 NULL 값은 하나의 그룹으로 처리됩니다. 즉, NULL 값이 있는 열도 그룹화할 수 있으며, NULL 값끼리는 하나의 그룹으로 묶입니다.
예제: 부서가 없는 직원 포함하여 그룹화
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
이 쿼리는 부서가 NULL인 직원들도 하나의 그룹으로 포함하여 반환합니다.
결과 예시:
department | employee_count |
---|---|
Sales | 3 |
HR | 2 |
Engineering | 4 |
NULL | 1 |
8. 실전 예제
예제 1: 부서별 직원 수 계산
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
예제 2: 부서별 평균 급여가 5000 이상인 부서만 조회
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 5000;
예제 3: 부서별 최대 급여를 내림차순으로 정렬
SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department
ORDER BY max_salary DESC;
9. GROUP BY의 주의 사항
- GROUP BY와 SELECT: GROUP BY에서 지정하지 않은 열은 SELECT 절에 사용할 수 없습니다. SELECT 절에서 선택된 열은 GROUP BY 절에 포함되거나, 집계 함수로 사용되어야 합니다.
- NULL 값: GROUP BY에서 NULL 값은 하나의 그룹으로 묶입니다.
- ORDER BY: GROUP BY는 정렬을 보장하지 않으므로, 결과를 정렬하려면 ORDER BY를 추가로 사용해야 합니다.
10. 요약
- SQL GROUP BY 절은 데이터를 특정 열의 값에 따라 그룹화하고, 각 그룹에 대한 집계 결과를 반환하는 데 사용됩니다.
- COUNT(), SUM(), **AVG()**와 같은 집계 함수와 함께 사용하여 데이터를 요약할 수 있습니다.
- HAVING 절을 사용해 그룹화된 결과에 조건을 걸 수 있으며, ORDER BY를 사용해 정렬할 수 있습니다.
- GROUP BY는 데이터 분석이나 요약 보고서를 작성할 때 매우 유용한 도구입니다.