상상해봐, 네가 수천 개의 데이터 행을 다루고 있다고 해 — 그 안에서 의미를 어떻게 찾을 수 있을까? 여기서 GROUP BY 연산자가 등장하지! SQL 오케스트라의 진짜 지휘자라고 할 수 있어. 흩어진 데이터를 딱 맞는 멜로디로 바꿔주지: 세고, 그룹화하고, 요약해줘. 각 고객이 몇 번 주문했는지, 각 코스에 학생이 몇 명인지, 부서별로 월급이 어떻게 분포되는지 알고 싶어? 이 모든 게 GROUP BY의 역할이야. 오늘은 이 녀석과 친해지고, 테이블에서 최대한 이득을 뽑아내는 방법을 알아볼 거야.
그룹화란, 하나 이상의 컬럼에서 같은 값을 가진 행들을 논리적인 그룹으로 묶는 과정이야. 이렇게 하면 각 그룹마다 집계 함수를 따로 적용할 수 있어.
예를 들어, 직원 테이블이 있는데 각 부서별로 평균 월급을 알고 싶다고 해. 한 부서가 한 그룹이 되는 거지. SQL은 GROUP BY로 직원 테이블을 부서별로 나누고, 각 그룹에 AVG()를 적용해줘.
GROUP BY 문법
SQL에서 그룹화를 쓸 때 가장 중요한 규칙: GROUP BY를 쓰면, 집계 함수에 들어가지 않은 모든 컬럼은 GROUP BY에 꼭 써줘야 해.
문법:
SELECT 컬럼1,
집계_함수(컬럼2)
FROM 테이블
GROUP BY 컬럼1;
작동 단계:
- 어떤 컬럼으로 데이터를 그룹화할지
GROUP BY에 적어. - 그룹별로 값을 계산하려면 집계 함수를 써.
SELECT에 있는 컬럼 중 집계 함수에 안 들어간 건 전부GROUP BY에 써야 해. SQL이 이 부분 엄청 깐깐해서, 까먹으면 에러로 바로 알려줘.
예시: 학생들을 학부별로 그룹화하기
예를 들어, students 테이블이 있다고 해. 학생 정보가 들어있어:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
이제 각 학부별로 평균 학점(GPA)을 알고 싶어. GROUP BY로 쿼리를 이렇게 짜면 돼:
SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
결과:
| faculty | avg_gpa |
|---|---|
| ComputerSci | 3.9 |
| Math | 3.7 |
| Physics | 3.7 |
SQL이 먼저 faculty 컬럼 값으로 데이터를 그룹으로 나누고, 각 그룹에 AVG() 함수를 적용한 거야.
GROUP BY 쓸 때 주의할 점
SELECT에 들어가는 컬럼 규칙
SQL은 SELECT에 적은 컬럼 중 집계 함수(SUM(), COUNT() 등)에 안 들어간 건 전부 GROUP BY에 있어야 한다고 요구해. 그룹화 없이 SQL은 어떤 값을 보여줘야 할지 모르는 거지.
이런 쿼리를 실행하면 에러가 나와:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;
에러: name 컬럼이 GROUP BY에 없음. 고치려면 name을 GROUP BY에 추가해야 해:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;
근데 이러면 학생별로 그룹이 나뉘니까, 우리가 원했던 결과랑은 좀 달라.
- 여러 컬럼으로 그룹화하기
한 컬럼만이 아니라 여러 컬럼으로도 그룹화할 수 있어. 예를 들어, 학부뿐 아니라 학생 이름별로도 그룹화하고 싶으면, GROUP BY에 두 번째 컬럼을 추가하면 돼:
SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;
원본 테이블:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
결과:
| faculty | name | avg_gpa |
|---|---|---|
| ComputerSci | Alex Lin | 3.8 |
| ComputerSci | Anna Song | 4.0 |
| Math | Maria Chi | 3.5 |
| Math | Otto Art | 3.9 |
| Physics | Liam Park | 3.7 |
- 여러 집계 함수로 그룹화하기
집계 함수 하나만 쓸 필요 없어! 예를 들어, 학부별 학생 수와 평균 학점을 같이 구하고 싶으면 이렇게 하면 돼:
SELECT faculty,
COUNT(*) AS student_count,
AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
원본 테이블:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
결과:
| faculty | student_count | avg_gpa |
|---|---|---|
| ComputerSci | 2 | 3.9 |
| Math | 2 | 3.7 |
| Physics | 1 | 3.7 |
SQL에서 그룹화할 때: 뭐가 되고 뭐가 안 되는지
그룹화 쿼리는 쓰기 쉽지만, 실제로는 쿼리의 절반은 제대로 안 돌아갈 수도 있어. 그룹화는 우리가 머릿속으로 생각하는 방식과는 좀 다르게 동작해.
SQL 쿼리에 GROUP BY가 있으면, 결과 컬럼은 전부 계산된 표현식이라고 생각해야 해. SELECT에 들어가는 컬럼은 두 가지 타입만 가능해:
- 그룹 컬럼을 기반으로 집계 함수로 계산된 값.
- GROUP BY에 들어간 컬럼 — 이걸로 그룹화가 되어야 해.
students 테이블로 GROUP BY 쿼리를 하면, 결과 테이블에 개별 학생이 나올 수 없어! 평균 키, 평균 몸무게, 평균 학점 같은 것만 가능해. 이런 코드는 안 돌아가:
SELECT faculty, name
FROM students
GROUP BY faculty;
왜 그런지 한번 파헤쳐보자.
GROUP BY faculty 연산자는 students 테이블의 학생들을 faculty 값이 같은 그룹으로 나눠. 각 그룹의 학생들은 faculty가 같으니까, 그룹 자체에 faculty 속성이 있다고 할 수 있어. 근데 name은 학생마다 다르지. 그래서 그룹에는 name 속성이 없어.
GROUP BY faculty, gender 연산자는 students 테이블의 학생들을 faculty와 gender 값이 같은 그룹으로 나눠. 각 그룹의 학생들은 faculty와 gender가 같으니까, 그룹 자체에 faculty와 gender 속성이 있다고 할 수 있어. 하지만 여전히 그룹에는 하나의 name이 없어.
이렇게 쓰는 건 가능해:
SELECT faculty, gender
FROM students
GROUP BY faculty, gender;
이렇게도 가능해:
SELECT
faculty,
gender,
AVG(age) as group_avg_age, -- group_avg_age는 그룹 학생들의 age 값으로 계산됨
MAX(high) as group_high -- group_high는 그룹 학생들의 high 값으로 계산됨
FROM students
GROUP BY faculty, gender;
근데 age나 high를 그냥 SELECT에 쓰는 건 안 돼.
GROUP BY 쓸 때 흔한 실수들
GROUP BY로 쿼리를 짜기 시작하면, 이런 함정들이 있을 수 있어:
SELECT에 모든 컬럼을 안 썼을 때. 집계 함수가 아닌 컬럼은 전부GROUP BY에 있어야 해. 안 그러면 SQL이 뭘 보여줘야 할지 몰라.NULL로 그룹화.NULL값은 따로 그룹으로 취급돼. 컬럼에NULL이 있으면, SQL이NULL그룹을 만들어.불필요하게 많은 그룹.
GROUP BY에 컬럼을 너무 많이 넣으면, 결과가 너무 세분화돼서 분석하기 힘들어질 수 있어.
이제 GROUP BY로 데이터를 효과적으로 그룹화하는 방법을 알게 됐지! SQL에서 가장 강력한 도구 중 하나라서, 집계 데이터 다루고 구조화된 리포트 만들 때 엄청 유용해. 다음엔 HAVING으로 추가 필터를 거는 방법까지 더 깊게 파고들어볼 거야.
GO TO FULL VERSION