개요
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
'Study > Database' 카테고리의 다른 글
[Mysql] IFNULL 과 NULLIF 차이 (0) | 2022.11.23 |
---|---|
[Mysql] 어제 날짜의 시작 일자(YYYY-MM-DD 00:00:00), 종료일자 (YYYY-MM-DD 23:59:59) 구하기 (0) | 2022.07.15 |
[Mysql] insert시 데이터가 이미 존재하면 update 하는 방법 (upsert문) (0) | 2022.07.15 |
[MySql] 조회 결과 레코드 번호 매기기 (0) | 2022.07.15 |
[Oracle] 윈도우에 Oracle 11g 설치하기 (0) | 2022.07.15 |