GROUP BY와 HAVING을 활용한 데이터 그룹화 및 집계 함수 이해하기
GROUP BY를 사용하면 데이터를 특정 기준으로 그룹화할 수 있으며, HAVING 절을 통해 그룹화된 데이터에 조건을 추가할 수 있습니다. 집계 함수와 함께 사용하여 통계 정보를 얻고, GROUP BY와 ORDER BY의 차이를 이해하여 결과를 정렬할 수 있습니다.
GROUP BY를 사용한 데이터 그룹화
SQL에서 GROUP BY
절은 데이터를 특정 컬럼을 기준으로 그룹화하여 집계 결과를 도출하는 데 사용됩니다. 이를 통해 동일한 값을 가진 행들을 묶고, 각 그룹에 대한 통계 정보를 얻을 수 있습니다. GROUP BY
는 주로 집계 함수와 함께 사용되며, 예를 들어 SUM
, AVG
, COUNT
등의 함수를 통해 그룹화된 데이터에 대한 계산을 수행할 수 있습니다.
GROUP BY 기본 문법
GROUP BY
의 기본 문법은 다음과 같습니다:
SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1;
여기서 column1
은 그룹화할 기준이 되는 컬럼이고, aggregate_function
은 집계 함수를 의미합니다.
예제: 부서별 직원 수 조회
HR 데이터베이스의 employees
테이블을 사용하여 부서별 직원 수를 조회하는 예제를 살펴보겠습니다. 이 예제에서는 department_id
를 기준으로 직원 수를 계산합니다.
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
위 쿼리는 각 부서(department_id
)에 속한 직원의 수를 계산하여 employee_count
라는 별칭으로 결과를 반환합니다.
예제: 부서별 평균 급여 조회
이번에는 부서별 평균 급여를 조회하는 예제를 살펴보겠습니다. 이 경우 salary
컬럼의 평균 값을 구합니다.
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
이 쿼리는 각 부서의 평균 급여를 계산하여 average_salary
라는 별칭으로 결과를 반환합니다.
GROUP BY와 여러 컬럼 사용하기
GROUP BY
는 여러 컬럼을 기준으로 그룹화할 수도 있습니다. 예를 들어, 부서와 직무를 기준으로 직원 수를 조회할 수 있습니다.
SELECT department_id, job_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, job_id;
위 쿼리는 각 부서와 직무 조합에 대한 직원 수를 계산하여 결과를 반환합니다.
이처럼 GROUP BY
를 사용하면 데이터를 효과적으로 그룹화하고, 집계 함수를 통해 다양한 통계 정보를 손쉽게 얻을 수 있습니다.
HAVING 절 사용법
HAVING
절은 SQL에서 GROUP BY
로 그룹화된 데이터에 조건을 추가할 때 사용됩니다. HAVING
은 집계 함수와 함께 사용되어 그룹화된 결과에 대한 필터링을 수행할 수 있습니다. WHERE
절과의 차이점은 WHERE
는 그룹화 이전의 행에 대한 조건을 적용하는 반면, HAVING
은 그룹화 이후의 결과에 조건을 적용한다는 점입니다.
HAVING 기본 문법
HAVING
의 기본 문법은 다음과 같습니다:
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
여기서 condition
은 집계 함수의 결과에 대한 조건을 의미합니다.
예제: 부서별 평균 급여가 2000 이상인 부서 조회
HR 데이터베이스의 employees
테이블을 사용하여 평균 급여가 2000 이상인 부서를 조회하는 예제를 살펴보겠습니다.
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) >= 2000;
위 쿼리는 각 부서의 평균 급여를 계산한 후, 그 값이 2000 이상인 부서만 결과로 반환합니다.
예제: 부서별 직원 수가 3명 이상인 부서 조회
이번에는 직원 수가 3명 이상인 부서를 조회하는 예제를 살펴보겠습니다.
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 3;
이 쿼리는 각 부서의 직원 수를 계산한 후, 직원 수가 3명 이상인 부서만 결과로 반환합니다.
HAVING과 WHERE의 차이
HAVING
과 WHERE
는 모두 조건을 지정하는 데 사용되지만, 적용되는 시점이 다릅니다. WHERE
는 그룹화 이전의 데이터에 필터를 적용하고, HAVING
은 그룹화 이후의 집계 결과에 필터를 적용합니다. 예를 들어, 특정 부서에 속한 직원만 조회하고 싶다면 WHERE
를 사용하고, 그룹화된 결과에 대한 조건을 추가하고 싶다면 HAVING
을 사용해야 합니다.
예제: 특정 부서의 평균 급여 조회
특정 부서(예: 부서 ID가 10인 부서)의 평균 급여를 조회하는 예제를 살펴보겠습니다.
SELECT department_id, AVG(salary) AS average_salary
FROM employees
WHERE department_id = 10
GROUP BY department_id;
위 쿼리는 부서 ID가 10인 직원들만 필터링한 후, 해당 부서의 평균 급여를 계산합니다. 만약 부서 ID가 10인 부서의 평균 급여가 2000 이상인지 확인하고 싶다면 HAVING
을 사용할 수 있습니다.
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id
HAVING department_id = 10 AND AVG(salary) >= 2000;
이렇게 HAVING
절을 사용하여 그룹화된 데이터에 대한 조건을 추가함으로써 더욱 유용한 분석을 수행할 수 있습니다.
집계 함수와 GROUP BY의 결합
SQL에서 집계 함수는 여러 행의 데이터를 단일 값으로 요약하는 데 사용됩니다. GROUP BY
절과 결합하여 특정 기준으로 그룹화된 데이터에 대한 통계 정보를 쉽게 계산할 수 있습니다. 일반적으로 사용되는 집계 함수에는 COUNT
, SUM
, AVG
, MIN
, MAX
등이 있습니다.
집계 함수의 종류
- COUNT: 행의 수를 계산합니다.
- SUM: 특정 컬럼의 합계를 계산합니다.
- AVG: 특정 컬럼의 평균 값을 계산합니다.
- MIN: 특정 컬럼의 최소 값을 찾습니다.
- MAX: 특정 컬럼의 최대 값을 찾습니다.
예제: 부서별 직원 수 계산
HR 데이터베이스의 employees
테이블을 사용하여 부서별 직원 수를 계산하는 예제를 살펴보겠습니다.
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
위 쿼리는 각 부서(department_id
)에 속한 직원의 수를 계산하여 employee_count
라는 별칭으로 결과를 반환합니다.
예제: 부서별 총 급여 계산
이번에는 부서별 총 급여를 계산하는 예제를 살펴보겠습니다. SUM
함수를 사용하여 각 부서의 급여 총합을 구합니다.
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id;
이 쿼리는 각 부서의 급여 총합을 계산하여 total_salary
라는 별칭으로 결과를 반환합니다.
예제: 부서별 평균 급여 계산
부서별 평균 급여를 계산하는 예제를 살펴보겠습니다. AVG
함수를 사용하여 각 부서의 평균 급여를 구합니다.
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
이 쿼리는 각 부서의 평균 급여를 계산하여 average_salary
라는 별칭으로 결과를 반환합니다.
예제: 부서별 최고 및 최저 급여 조회
부서별 최고 급여와 최저 급여를 조회하는 예제를 살펴보겠습니다. MAX
와 MIN
함수를 함께 사용하여 결과를 반환합니다.
SELECT department_id, MAX(salary) AS highest_salary, MIN(salary) AS lowest_salary
FROM employees
GROUP BY department_id;
위 쿼리는 각 부서의 최고 급여(highest_salary
)와 최저 급여(lowest_salary
)를 계산하여 결과를 반환합니다.
집계 함수와 GROUP BY의 조합
이처럼 집계 함수와 GROUP BY
를 결합하면 데이터베이스에서 유용한 통계 정보를 쉽게 도출할 수 있습니다. 그룹화된 데이터에 대한 다양한 분석을 수행할 수 있으며, 이를 통해 데이터의 패턴과 트렌드를 이해하는 데 도움이 됩니다.
GROUP BY와 ORDER BY의 차이
GROUP BY
와 ORDER BY
는 SQL에서 데이터를 처리할 때 사용되는 절이지만, 그 목적과 기능은 다릅니다. 각각의 역할을 이해하는 것은 데이터베이스 쿼리를 작성하는 데 매우 중요합니다.
GROUP BY의 역할
GROUP BY
절은 데이터를 특정 컬럼을 기준으로 그룹화하여 집계 결과를 생성하는 데 사용됩니다. 주로 집계 함수와 함께 사용되어 각 그룹에 대한 통계 정보를 제공합니다. 예를 들어, 부서별 직원 수를 계산하는 경우 GROUP BY
를 사용하여 부서별로 데이터를 묶습니다.
예제: 부서별 직원 수 계산
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
위 쿼리는 각 부서(department_id
)에 속한 직원 수를 계산하여 그룹화된 결과를 반환합니다.
ORDER BY의 역할
ORDER BY
절은 쿼리 결과를 특정 컬럼을 기준으로 정렬하는 데 사용됩니다. 기본적으로 오름차순(ASC)으로 정렬되며, 내림차순(DESC)으로도 정렬할 수 있습니다. 이 절은 결과 집합의 순서를 제어하여, 사용자가 원하는 형식으로 데이터를 표시할 수 있도록 합니다.
예제: 직원 급여를 기준으로 정렬
SELECT first_name, salary
FROM employees
ORDER BY salary DESC;
위 쿼리는 직원의 이름과 급여를 조회한 후, 급여를 기준으로 내림차순으로 정렬하여 결과를 반환합니다.
GROUP BY와 ORDER BY의 결합
GROUP BY
와 ORDER BY
는 함께 사용할 수 있으며, 이 경우 먼저 데이터를 그룹화한 후, 그룹화된 결과를 정렬합니다. 예를 들어, 부서별 직원 수를 계산한 후, 직원 수를 기준으로 정렬할 수 있습니다.
예제: 부서별 직원 수를 기준으로 정렬
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
ORDER BY employee_count DESC;
위 쿼리는 각 부서의 직원 수를 계산한 후, 그 수를 기준으로 내림차순으로 정렬하여 결과를 반환합니다.
요약
- GROUP BY: 데이터를 특정 컬럼을 기준으로 그룹화하여 집계 결과를 생성합니다.
- ORDER BY: 쿼리 결과를 특정 컬럼을 기준으로 정렬합니다.
이 두 절은 데이터 분석에서 매우 중요한 역할을 하며, 적절히 조합하여 사용하면 더욱 유용한 결과를 얻을 수 있습니다.