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;
'DB > MySQL' 카테고리의 다른 글
[Mysql] 범주 조회 (DISTINCT) (0) | 2023.09.15 |
---|---|
[Mysql] 컬럼 값 하나로 문자열로 합치기( GROUP_CONCAT) (0) | 2023.09.15 |
[Mysql] 형 변환 CAST, CONVERT 차이 점 및 예시 (0) | 2023.09.15 |
[Mysql] ADDDATE , INTERVAL 사용해서 특정 날짜 (연, 월, 일, 시, 분, 초) 더하기 및 빼기 (0) | 2023.09.15 |
[My-SQL] ON DELETE CASCADE (외래키로 연결된 row 한번에 지우는 법) (0) | 2023.02.17 |