MYSQL에서 데이터를 한 줄의 문자열로 붙여서 나열할 때 GROUP_CONCAT을 사용할 수 있습니다. 그룹화된 여러 값을 구분자와 정렬 규칙에 따라 하나의 문자열로 합치는 방법에 대해 알아보겠습니다.
샘플 테이블
| emp_id | 이름 | 부서 | 직무 |
|---|---|---|---|
| 1 | 김하늘 | 플랫폼개발팀 | 백엔드 개발자 |
| 2 | 박지우 | 플랫폼개발팀 | 백엔드 개발자 |
| 3 | 이서준 | 인프라운영팀 | 시스템 엔지니어 |
| 4 | 최민서 | 인프라운영팀 | DBA |
| 5 | 정도윤 | 보안기술팀 | 보안 엔지니어 |
| skill_id | 기술명 |
|---|---|
| 1 | Java |
| 2 | Spring |
| 3 | MySQL |
| 4 | Docker |
| 5 | Kubernetes |
| 6 | Linux |
| 7 | Nginx |
| 8 | Python |
| 9 | Redis |
| 10 | Bash |
| emp_id | skill_id | 숙련도 |
|---|---|---|
| 1 | 1 | 5 |
| 1 | 2 | 4 |
| 1 | 3 | 4 |
| 1 | 4 | 3 |
| 1 | 6 | 4 |
| 2 | 1 | 4 |
| 2 | 2 | 3 |
| 2 | 9 | 3 |
| 3 | 6 | 5 |
| 3 | 10 | 4 |
| 3 | 7 | 3 |
| 3 | 4 | 3 |
| 4 | 3 | 5 |
| 4 | 9 | 4 |
| 4 | 6 | 4 |
| 5 | 6 | 4 |
| 5 | 7 | 4 |
| 5 | 3 | 3 |
| 5 | 4 | 2 |
한 사람의 기술을 한 줄로 조회
SELECT
e.emp_id,
e.이름,
GROUP_CONCAT(s.기술명 ORDER BY s.기술명 SEPARATOR ', ') AS 보유기술
FROM employee e
JOIN employee_skill es ON es.emp_id = e.emp_id
JOIN skill s ON s.skill_id = es.skill_id
GROUP BY e.emp_id, e.이름
ORDER BY e.emp_id;세 개의 테이블은 emp_id와 skill_id로 연결되어 있기 때문에 JOIN으로 붙여주고 GROUP_CONCAT으로 기술명을 쉼표(,) 구분자로 연결해준 형태입니다.

기술에 숙련도 라벨을 달아주기
SELECT
e.이름,
GROUP_CONCAT(CONCAT(s.기술명, '(', es.숙련도, ')')
ORDER BY es.숙련도 DESC, s.기술명 ASC
SEPARATOR ', ') AS 기술_라벨형
FROM employee e
JOIN employee_skill es ON es.emp_id = e.emp_id
JOIN skill s ON s.skill_id = es.skill_id
GROUP BY e.이름;보유 기술의 숙련도 수준을 내림차순으로 같이 표기하는 방식입니다. GROUP_CONCAT 안에 CONCAT을 또 써서 숙련도 정보를 붙였습니다.

특정 기술을 가진 사람 목록
SELECT
s.기술명,
GROUP_CONCAT(e.이름 ORDER BY e.이름 SEPARATOR ', ') AS 직원들
FROM skill s
JOIN employee_skill es ON es.skill_id = s.skill_id
JOIN employee e ON e.emp_id = es.emp_id
GROUP BY s.기술명;특정 기술을 가진 사람의 목록을 출력하기 위한 쿼리입니다.
