메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
COUNT는 그룹에 행이 몇 개인지 알려 줍니다. GROUP_CONCAT는 그 값들을 1개의 문자열로 이어 붙여서 그것들이 무엇이었는지 알려 줍니다. 상세 내용을 숫자로 줄이는 대신 유지하는 집계 함수입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

GROUP_CONCAT의 동작 방식

GROUPING_COLUMN을 그룹을 정의하는 열로, TABLE_NAME을 테이블로, COLUMN_NAME을 이어 붙일 열로, SEPARATOR_TEXT를 값 사이에 들어갈 것으로 바꾸세요. ORDER BY와 SEPARATOR는 둘 다 선택 사항이고, 바깥의 쿼리가 아니라 괄호 안에 들어갑니다. SEPARATOR가 없으면 값은 공백 없는 쉼표로 이어집니다. ORDER BY가 없으면 특정한 순서 없이 나옵니다.

예제

  1. 각 그룹의 값 이어 붙이기

5개가 아니라 4개의 행인데, 185분짜리 NC-17 영화가 없어서 WHERE가 그룹화 전에 그 행들을 제거했기 때문입니다. 남은 행이 없는 그룹은 나타나지 않습니다.

  1. 반복 제거하기

괄호 안의 DISTINCT는 각 그룹 안의 중복 값을 제거합니다.
DISTINCT가 없으면 각 문자열은 그룹의 영화마다 요금 1개씩, 178개에서 223개 사이를 담게 되고, 가장 긴 2개는 다음 절에서 다루는 제한에 부딪힙니다. 이것은 기본 구분자이기도 합니다: 쉼표 하나뿐, 그 밖에는 아무것도 없습니다.

결과는 group_concat_max_len 바이트에서 잘립니다

이것이 함정입니다. 서버는 너무 길어진 GROUP_CONCAT 결과를 자르고, 오류를 내지 않습니다. 제한은 설정이므로, 아래의 숫자는 MySQL의 속성이 아니라 이 서버의 것이며, 문자가 아니라 바이트를 셉니다.
정확히 1,024인데, 그것만으로도 의심스럽습니다: 실제 합계가 딱 떨어지는 숫자에 떨어지는 일은 드뭅니다. 설정과 대조해 확인하세요.
첫 번째 쿼리의 출력 하단이 경고 1개를 보고했고, SHOW WARNINGS가 무엇을 잃었는지 말해 줍니다: Warning 1260 Row 65 was cut by GROUP_CONCAT(). 문자열은 1,000개 중 64개의 온전한 제목을 담고 65번째의 중간에서 멈춥니다. GROUP_CONCAT 뒤에 직접 SHOW WARNINGS를 실행해서 같은 메시지를 확인하세요. SET SESSION group_concat_max_len = 100000;은 연결의 나머지 동안 제한을 높이고, 다시 연결하면 원래대로 돌아갑니다. 제한이 바이트를 세기 때문에, ASCII 밖의 텍스트는 숫자가 시사하는 것보다 빨리 잘립니다: utf8mb4에서 문자 하나는 최대 4바이트를 차지할 수 있습니다. 길이가 group_concat_max_len과 정확히 같은 결과는 확인하기 전까지 잘린 것으로 취급하고, 출력 하단의 경고 개수를 살피세요.

요약

  • 그룹의 값들을 1개의 문자열로 이어 붙이려면 GROUP_CONCAT를 사용하세요.
  • ORDER BY, SEPARATOR, DISTINCT는 괄호 안에 넣으세요.
  • 구분자를 지정하지 않으면 공백 없는 쉼표가 쓰인다고 예상하세요.
  • group_concat_max_len 바이트에서 오류가 아니라 경고와 함께 잘린다고 예상하세요.
  • 길이가 제한과 정확히 같으면 언제나 잘림을 의심하세요.

함께 보기