공부/SQL

mysql > group_concat

shining park 2025. 4. 27. 22:44

❓실습문제를 푸는데 나와 강사님의 코드가 다른 부분 (group_concat)이 있어 공부하고자 작성

group by 와 함께 데이터를 보기 좋게 묶어 보여줄 수 있으므로 사용 연습 필요

 

# ✅10. 같은 부서에 근무하는 직원들의 사원명, 부서명, 동료이름을 조회하시오. (self join 사용)
    select e1.EMP_NAME, d.DEPT_TITLE, e2.EMP_NAME as 동료이름
    from (employee e1, department d) join employee e2
    on e1.DEPT_CODE = e2.DEPT_CODE
    where e1.DEPT_CODE = d.DEPT_ID
    and e1.EMP_NO != e2.EMP_NO;

-- Teacher's Query
-- version 1
    select
        e.emp_name 사원명,
        d.dept_title 부서명,
        c.emp_name 동료사원명
    from
        employee e
            join employee c on (e.dept_code = c.dept_code and e.emp_id != c.emp_id)
            join department d on e.dept_code = d.dept_id;

-- version 2 : 스칼라 서브쿼리, group_concat 사용
    select
        dept_code,
        (select dept_title from department where dept_id = e.dept_code) dept_title,
        group_concat(emp_name SEPARATOR ',')
    from
        employee e
    group by
        dept_code;
 

✅ 개념

GROUP_CONCAT은 GROUP BY로 묶인 그룹 안의 문자열들을 하나로 합쳐주는 집계 함수
실습문제에서 같은 그룹(예: 부서) 내의 여러 이름을 쉼표 등으로 이어서 한 줄로 출력해줄 수 있음

 
✅ 특징
  • GROUP_CONCAT(emp_name SEPARATOR ',')
    • 부서별로 emp_name을 전부 합쳐서, 쉼표(,)로 구분해서 한 줄 문자열로 만들어 줄 수 있음
    • ex) 홍길동,김철수,이영희

✅ 결과

D1 인사팀 김영희,홍길동,박민수
D2 개발팀 이지훈,조수빈
 
✅ 추가
  • 구분자(Separator) 바꾸기
    • GROUP_CONCAT(emp_name SEPARATOR ' / '); → 김영희 / 홍길동 / 박민수
    • 옵션이 주어지지 않을 경우, 기본값은 " , "
  • group_concat 의 결과 문자열이 길 경우
    •  SET SESSION group_concat_max_len = 10000; → group_concat_max_len의 값을 늘려야 함
    • mysql의 기본 설정으로는 문자열 1024까지 출력 가능