개요
여러 값이 저장되어 있는 테이블에서 특정 컬럼에 그룹 별로 값이 어떤 것들이 있는지 확인하고 싶다. 이럴 때는 그룹 별로 여러 행의 데이터를 하나의 필드로 연결하는 GROUP_CONCAT 함수를 사용할 수 있다.
사용법을 적어둔다.
GROUP_CONCAT
GROUP_CONCAT은 여러 행의 데이터를 하나의 필드로 연결하는데 사용하는 함수이다. 그룹에 NULL이 아닌 값이 포함되어 있으면 문자열 값을 반환하는 집계 함수로, 그룹에 값이 전부 NULL이면 NULL을 반환한다.
SELECT GROUP_CONCAT ( [DISTINCT] col_name1 [ORDER BY 절] [SEPARATOR str_val] )
FROM 테이블_이름
GROUP BY 그룹화_기준_열;
예시
다음과 같이 물건의 유형과 이름을 저장하는 테이블이 있다고 하자.
| type | name |
| ------ | ---- |
| fruit | 수박 |
| fruit | 사과 |
| fruit | 사과 |
| cooker | 뒤집개 |
DDL
더보기
CREATE TABLE test (
type varchar(50),
name varchar(50)
);
INSERT INTO test VALUES ('fruit', '수박');
INSERT INTO test VALUES ('fruit', '사과');
INSERT INTO test VALUES ('fruit', '사과');
INSERT INTO test VALUES ('cooker', '뒤집개');
물건의 유형별로 이름을 한 행으로 보고 싶다면 아래와 같이 type 별로 그룹화한 다음, GROUP_CONCAT 함수에 name을 전달하면 된다.
SELECT type
, GROUP_CONCAT(name)
FROM test
GROUP BY type
;
실행 결과
| type | GROUP_CONCAT(name) |
| ------ | ------------------ |
| cooker | 뒤집개 |
| fruit | 수박,사과,사과 |
구분자 변경
GROUP_CONCAT 함수는 기본적으로 쉼표를 구분자로 사용하며, 만약 구분자를 변경하고 싶다면 SEPARATOR를 전달하면 된다.
SELECT type
, GROUP_CONCAT(name SEPARATOR '|')
FROM test
GROUP BY type
;
실행 결과
| type | GROUP_CONCAT(name SEPARATOR '|') |
| ------ | -------------------------------- |
| cooker | 뒤집개 |
| fruit | 수박|사과|사과 |
중복 제거
중복을 제거할 때에는 GROUP_CONCAT 함수에 DISTINCT를 사용하면 된다.
SELECT type
, GROUP_CONCAT(DISTINCT name)
FROM test
GROUP BY type
;
실행 결과
| type | GROUP_CONCAT(DISTINCT name) |
| ------ | --------------------------- |
| cooker | 뒤집개 |
| fruit | 사과,수박 |
참고 문서
https://fruitdev.tistory.com/16