SQL의 GROUP BY 절은 집계 함수와 함께 사용되며, 쿼리에서 선택한 데이터를 특정 열을 기준으로 묶어 정리하는 데 활용됩니다. 하나의 열뿐만 아니라 여러 개의 열을 지정하여 그룹화할 수도 있습니다.
SQL에서 집계 함수를 사용할 때는 공통된 열 값을 기준으로 행을 묶어야 하는 경우가 많습니다.
예를 들어, 회사의 지점 이름 목록과 함께 각 지점에서 근무하는 직원 수를 확인하고 싶다고 가정해 보겠습니다. 이 경우 집계 함수를 사용하고 지점 이름을 기준으로 그룹화해야 합니다.
바로 이럴 때 SQL GROUP BY 절이 필요합니다. 이 글에서는 GROUP BY 절을 사용하는 방법을 예제와 함께 자세히 살펴보겠습니다.
집계 함수 복습
데이터베이스를 다루다 보면 실제 데이터 자체가 아니라 데이터에 대한 정보가 필요한 경우가 많습니다. 예를 들어, 회사에서 판매하는 고유 제품의 수나 리더보드의 최고 점수 등을 알고 싶을 수 있습니다.
SQL에는 이러한 정보를 손쉽게 얻을 수 있도록 도와주는 내장 함수들이 있는데, 이를 집계 함수(aggregate function)라고 부릅니다.
예를 들어, 영업 사원(Sales Associate) 직급인 직원이 몇 명인지 알고 싶다면 COUNT 함수를 사용할 수 있습니다. COUNT 함수는 특정 조건을 만족하는 행의 개수를 세어 반환합니다. 그 외에도 SUM, AVG, MIN, MAX 등 다양한 집계 함수가 있습니다.
SQL GROUP BY란?
SQL GROUP BY 절은 행들을 묶어주는 역할을 합니다. GROUP BY 절은 MIN, MAX와 같은 집계 함수를 사용하는 쿼리에서 흔히 사용되며, 집계 함수에 포함되지 않은 열의 정보를 어떻게 집계할지 SQL에 알려주는 역할을 합니다.
GROUP BY 문의 기본 문법은 다음과 같습니다:
SELECT COUNT(column1_name), column2_name FROM table1_name GROUP BY column2_name;
위 쿼리에는 집계 함수가 사용되었고, 동시에 또 다른 열이 지정되었습니다.
이런 형태의 쿼리에서는 반드시 GROUP BY 문을 사용해야 합니다. GROUP BY 문은 집계 함수 외부에 있는 열의 데이터를 어떻게 표시할지 SQL에 알려주기 때문입니다. 즉, 집계 함수에 포함되지 않은 열을 기준으로 그룹화해야 합니다.
참고로 GROUP BY 절은 SQL SELECT 문에서만 사용할 수 있습니다.
그럼 GROUP BY 절의 실제 예제를 살펴보겠습니다.
GROUP BY 예제
각 직급(title)별로 직원이 몇 명인지 알고 싶다고 가정해 보겠습니다. 즉, 영업 사원이 몇 명인지, 마케팅 디렉터가 몇 명인지 등을 파악하려는 것입니다.
다음 쿼리를 사용하여 이 정보를 조회할 수 있습니다:
SELECT title, COUNT(title) FROM employees GROUP BY title;
쿼리 실행 결과는 다음과 같습니다:
| title | count |
| Senior Sales Associate | 1 |
| Sales Associate | 4 |
| Vice President of Sales | 1 |
| Marketing Director | 1 |
(4 rows)
GROUP BY 쿼리는 직원들이 가진 고유한 직급 목록을 반환하며, 각 직급 옆에 해당 직급을 가진 직원 수가 함께 표시됩니다.
SQL에서 GROUP BY는 언제 사용해야 할까?
GROUP BY 절은 집계 함수가 반환하는 결과보다 더 많은 정보가 필요할 때만 사용하면 됩니다.
예를 들어, 단순히 전체 고객 수만 알고 싶다면 일반적인 쿼리만으로 충분합니다:
SELECT COUNT(name) FROM customers;
실행 결과:
| count |
| 7 |
(1 row)
반면, 각 멤버십 플랜(loyalty plan)별 고객 수를 알고 싶다면 GROUP BY 문이 필요합니다. 다음은 멤버십 플랜 목록과 각 플랜에 가입한 고객 수를 조회하는 쿼리입니다:
SELECT loyalty_plan, COUNT(loyalty_plan) FROM customers GROUP BY loyalty_plan;
실행 결과:
| loyalty_plan | count |
| Gold | 1 |
| None | 3 |
| Silver | 1 |
| Bronze | 2 |
(4 rows)
여러 열을 기준으로 GROUP BY 사용하기
필요하다면 여러 열을 기준으로 GROUP BY를 수행할 수도 있습니다. 예를 들어, 특정 직급을 가진 직원이 각 지점별로 몇 명인지 알고 싶다면 다음 쿼리를 사용할 수 있습니다:
SELECT branch, title, COUNT(title) FROM employees GROUP BY branch, title;
실행 결과:
| branch | title | count |
| Stamford | Sales Associate | 1 |
| Albany | Vice President of Sales | 1 |
| San Francisco | Sales Associate | 1 |
| San Francisco | Senior Sales Associate | 1 |
| Albany | Marketing Director | 1 |
| Boston | Sales Associate | 2 |
(6 rows)
이 쿼리는 각 직원의 직급 목록과 해당 직급을 가진 인원 수를 보여주며, 데이터는 직원이 근무하는 지점(branch)과 직급(title)을 기준으로 그룹화됩니다.
마치며
SQL GROUP BY 절은 집계 함수가 사용되고 추가로 다른 열이 함께 조회되는 모든 문장에서 필수적입니다. 이때 반드시 집계 함수에 포함되지 않은 열을 기준으로 그룹화해야 한다는 점을 기억하세요.
실력을 시험해 보고 싶으신가요? 각 지점에서 근무하는 직원 수를 구하는 쿼리를 직접 작성해 보세요. 테이블 이름은 "employees"이고, 지점 이름이 저장된 열은 "branch"입니다. 위에서 배운 내용을 바탕으로 작성한 쿼리가 올바른지 스스로 검증해 보시기 바랍니다.