코딩 스쿨 SQL

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

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는 데이터 분석이나 요약 보고서를 작성할 때 매우 유용한 도구입니다.

copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com