Study/Database

[Mysql] group by 그룹 내 특정 컬럼 값들을 한번에 조회하기 (group_concat)

jonghne 2022. 7. 20. 18:19

개요 

mysql에서는 특정 컬럼을 기준으로 그룹화 할 수 있는 group by라는 기능이 존재한다. 

 

아래 예시의 테이블에서 dept_id 기준으로 사원 급여 통계를 내고 싶은 경우 group by절에 dept_id를 전달하고 SELECT 절에 집계함수(AVG) 를 사용하면 된다.

 

id name dept_id salary
1 Lee 1 1000
2 Park 1 2000
3 Son 2 3000
4 John 3 4000
5 Han 3 6000
6 Ahn 1 6000
dept_id salary
1 3000.0
2 3000.0
3 5000.0

 

문법

SELECT dept_id, AVG(salary)
FROM EMP 
WHERE 1=1
GROUP BY dept_id

 

 

보통 group by는 위의 예시와 같이 특정 컬럼을 기준으로 통계를 낼 때 사용되는데,

 

종종 group by 이후 통계 내는 것이 아닌, 그룹 내의 특정 컬럼 값들을 한번에 조회하고 싶은 경우가 있다. (ex) dept_id 별 사원 목록) 

 

이때 , 그냥 group by만 사용한다면 하나의 값이 대표로 조회되고 나머지 값들은 조회되지 않는다. 

이럴 때는 group_concat이라는 함수를 사용하면 컬럼 값들이 하나의 리스트형태로 조회된다.

 

group_concat 사용법

group_concat 함수는 아래와 같이 group by를 적용한 쿼리의 select 절에서 사용된다. 

 

함수 입력값으로 첫번째는 컬럼명을, 두번째는 구분자를 넣으면 된다.  

 

SELECT dept_id, group_concat(name, '@') as name_list
FROM EMP 
WHERE 1=1
GROUP BY dept_id
dept_id name_list
1 Lee@Park@Ahn
2 Son
3 John@Han

 

 

참고로 아래와 같이 함수의 두번째 인자값인 구분자를 생략할 수 도 있는데

이때는 ',' 가 기본값으로 구분자 역할을 하게 된다.

SELECT dept_id, group_concat(name) as name_list
FROM EMP 
WHERE 1=1
GROUP BY dept_id
dept_id name_list
1 Lee,Park,Ahn
2 Son
3 John,Han

 

이 group_concat은 그룹 내의 컬럼값들을 한번에 뽑아낼 수 있지만, 쿼리 결과로 String 타입이 리턴된다는 단점이 있다.

 

String 형태가 아닌 List 형태로 받고 싶을 때는 group_concat을 쓰지 않고 mybatis의 collection 기능을 사용하면 편리하다. 

 

해당 기능의 사용 방법은 아래 포스팅 참고 바란다! 

https://jonghne.tistory.com/36

 

[Mybatis] 1:N 레코드 한번에 조회하기 (resultMap의 Collection 사용)

이번 포스팅에서는 1:N 관계의 데이터를 쿼리 한번만 실행해서 가져올수 있는 방법에 대해 설명한다. 개요 1:1 관계를 맺고 있는 테이블에서는 JOIN 하여 두 개의 테이블 레코드를 한번에 조회 할

jonghne.tistory.com