RDBS/MYSQL

[MySQL]그룹화 하고 조건 부여하기(Group By절, Having절)

MoonSta 2023. 2. 3. 16:18

📌그룹화 하고 조건 부여하기(Group By절, Having절)

 실무에서 가장 많이 사용되고, 가장 이해하기 어려운 GROUP BY에 대해 알아보도록 하겠습니다. 이 구문은 실제 데이터를 조회하면서 데이터를 집계해야 할 상황이 생깁니다. 이러한 상황에서 GROUP BY로 특정 컬럼에 대한 그룹화를 할 수 있습니다. 더 나아가 집계 함수 및 조건(Having)을 부여하여 원하는 데이터의 추출이 가능합니다. 

 

📌GROUP BY의 기몬 문법 및 예제

SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼;
member_id member_age member_gender member_name
1 20 남성 문OO
2 20 남성 김OO
3 30 여성 김OO
4 40 여성 김OO
5 30 여성 차OO
6 20 남성 최OO
7 40 남성 조OO
8 40 남성 박OO
9 50 남성 구OO

🚩위와 같은 회원 예제 테이블이 있다. 위의 테이블에서 GROUP BY를 사용하여 그룹화를 하도록 하겠습니다. 

 

 

📌GROUP BY - member_age

SELECT member_age
	FROM member
    GROUP BY member_age;
member_age
20
30
40
50

 

 

📌GROUP BY - member_gender

SELECT member_gender
	FROM member
    GROUP BY member_gender;
member_gender
남성
여성

📌자주 사용되는 집계함수

집계 함수 사용 결과
count 총 개수
sum 총 합계
avg 평균
MAX 최대
MIN 최소

 

📌집계 함수 사용 예시

SELECT member_gender
     , count(*) AS '개수'
   FROM member
  GROUP BY member_gender;
member_gender 개수
남성 6
여성 3

📌그룹화 후 조건 부여 - Having절

SELECT 컬럼,그룹함수(컬럼)
    FROM 테이블명
   GROUP BY 그룹대상
  HAVING 그룹함수 포함 조건

🚩HAVING 절의 기본 형식에서 볼 수 있듯이 GROUP BY와 같이 쓰이며, 그룹 함수에 대한 조건을 걸 수 있는 구문이 바로 HAVING 절 입니다. 위의 형식에 맞춰 간단한 예제를 통해 사용해보도록 하겠습니다.

 

 

📌그룹화 후 조건 부여 - Having절 예제

사번(mem_id) 이름(mem_name) 부서(mem_dept) 급여(mem_salary) 
1 문OO 개발팀 300
2 차OO 인사팀 250
3 김OO  경호팀 220
4 최OO 개발팀 420
5 남OO 인사팀 320
6 정OO 경호팀 255
7 서OO 마케팅팀 275

🚩위와 같은 직원들의 정보를 가지고 있는 member 테이블이 있다. 위의 테이블에서 부서별 평균 급여를 조회해보도록 하겠습니다.

 

-- 부서별 평균 급여 조회
SELECT mem_dept
     , AVG(mem_salary) AS 'avg_salary'
   FROM member
  GROUP BY mem_dept;
부서(mem_dept) 평균 급여(avg_salary)                                                 
개발팀 360
인사팀 285
경호팀 237.5
마케팅팀 270

🚩부서별 평균 급여를 조회하였습니다. 다음 예제에서 이렇게 조회된 상태에서 HAVING 절을 사용하여 조건을 부여할 수 있습니다.

 

-- 부서별 평균 급여 조회
SELECT mem_dept
     , AVG(mem_salary) AS 'avg_salary'
   FROM member
  GROUP BY mem_dept
 HAVING avg_salary > 300

🚩HAVING 절을 사용하여 평균 급여가 300 이상인 부서를 조회하도록 하겠습니다.

 

부서(mem_dept) 평균 급여(avg_salary)
개발팀 360