DB/MySQL

[Mysql] 그룹화하여 데이터 조회 (GROUP BY) + HAVING

서견 2023. 9. 15. 00:18

MySQL에서 GROUP BY 구문은 특정 열(또는 열의 조합)을 기준으로 데이터를 그룹화하고 그룹 내에서 집계 함수를 사용하여 요약 정보를 생성하는 데 사용됩니다. GROUP BY는 일반적으로 집계 작업과 함께 사용되며 데이터를 카테고리별로 나누고 요약 정보를 계산하는 데 유용합니다.

GROUP BY 구문의 기본 구조는 다음과 같습니다:

SELECT column1, column2, ..., aggregate_function(column)
FROM table
WHERE conditions
GROUP BY column1, column2, ...;

여기서 각 요소의 역할은 다음과 같습니다:

  • column1, column2, ...: 그룹화할 열을 나타냅니다. 이 열은 SELECT 목록에 나타날 수도 있고, 아니면 집계 함수를 적용할 열로 사용될 수도 있습니다.
  • aggregate_function(column): 그룹 내에서 적용할 집계 함수를 나타냅니다. 집계 함수는 그룹 내에서 데이터를 합산, 평균, 최대값, 최소값 등으로 처리합니다.
  • table: 데이터를 검색할 테이블의 이름입니다.
  • conditions: 필요한 경우 필터링 조건을 추가할 수 있습니다.

이제 GROUP BY 구문을 예제와 함께 자세하게 설명하겠습니다.

예제 1: 부서별로 직원 수 계산하기

[예제 데이터]

| emp_id | emp_name | department |
|--------|----------|------------|
| 1      | Alice    | HR         |
| 2      | Bob      | Finance    |
| 3      | Carol    | HR         |
| 4      | David    | IT         |
| 5      | Eve      | Finance    |

[예제 코드]

SELECT department, COUNT(emp_id) AS employee_count
FROM employees
GROUP BY department;

[결과]

| department | employee_count |
|------------|----------------|
| HR         | 2              |
| Finance    | 2              |
| IT         | 1              |

이 예제에서는 부서(department)를 기준으로 직원 수를 그룹화하고, 각 부서별로 직원 수를 계산하여 결과를 반환합니다.

예제 2: 날짜별 판매 총액 계산하기

[예제 데이터]

| order_id | order_date | total_amount |
|----------|------------|--------------|
| 1        | 2023-09-01 | 100.00       |
| 2        | 2023-09-01 | 75.00        |
| 3        | 2023-09-02 | 50.00        |
| 4        | 2023-09-02 | 120.00       |
| 5        | 2023-09-03 | 90.00        |

[예제 코드]

SELECT order_date, SUM(total_amount) AS daily_total
FROM orders
GROUP BY order_date;

[결과]

| order_date | daily_total |
|------------|-------------|
| 2023-09-01 | 175.00      |
| 2023-09-02 | 170.00      |
| 2023-09-03 | 90.00       |

이 예제에서는 주문 날짜(order_date)를 기준으로 판매 총액을 그룹화하고, 각 날짜별로 판매 총액을 계산하여 결과를 반환합니다.

GROUP BY는 데이터베이스에서 데이터를 요약하고 집계할 때 매우 유용한 구문입니다. 데이터를 그룹화하고 원하는 요약 정보를 얻기 위해 사용됩니다.

HAVING 절

HAVING 절은 SQL 쿼리에서 GROUP BY 절 다음에 사용되며, 그룹화된 결과 집합에 조건을 적용할 때 사용됩니다. 일반적으로 HAVING 절은 집계 함수를 사용하여 그룹화된 결과 집합에서 특정 조건을 충족하는 그룹만을 선택하고자 할 때 사용됩니다. WHERE 절은 개별 레코드를 필터링하는 데 사용되고, HAVING 절은 그룹을 필터링하는 데 사용됩니다.

HAVING 절의 기본 구조는 다음과 같습니다:

sqlCopy code
SELECT column1, column2, ..., aggregate_function(column)
FROM table
WHERE conditions
GROUP BY column1, column2, ...
HAVING aggregate_function(column) condition;

여기서 condition 은 그룹화된 결과 집합에서 조건을 나타내며, 일반적으로 집계 함수를 사용하여 그룹화된 열을 대상으로 합니다. HAVING 절을 사용하면 그룹화된 결과에서 조건을 만족하는 그룹만 선택할 수 있습니다.

예제: 부서별로 평균 급여가 3000 이상인 부서 선택

[예제 데이터]

| emp_id | emp_name | department | salary |
|--------|----------|------------|--------|
| 1      | Alice    | HR         | 3500   |
| 2      | Bob      | Finance    | 2800   |
| 3      | Carol    | HR         | 3200   |
| 4      | David    | IT         | 4000   |
| 5      | Eve      | Finance    | 3100   |

[예제코드]

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING avg_salary >= 3000;

[결과]

| department | avg_salary |
|------------|------------|
| HR         | 3350.0000  |
| IT         | 4000.0000  |

이 예제에서는 부서(department)를 기준으로 그룹화하고, 각 부서별로 평균 급여(salary)를 계산합니다. 그런 다음 HAVING 절을 사용하여 평균 급여가 3000 이상인 부서만을 선택합니다.

HAVING 절을 사용하면 그룹화된 결과를 조건에 따라 필터링하여 원하는 그룹만을 선택할 수 있습니다. 이는 집계 함수와 함께 데이터를 요약하고 필요한 조건을 만족하는 그룹을 식별하는 데 유용합니다.

WHERE + HAVING 둘 다 사용하는 예제

type 그룹화하여 name 갯수를 가져온 후, 그 중에 갯수가 2개 이상인 데이터 조회 (조건 처리 후에 컬럼 그룹화 후에 조건 처리)

SELECT type, COUNT(name) as cnt_name from hero_collection where COUNT(name) ≥ 2 group by type;