CodeGym /행동 /SQL SELF /데이터 그룹화(GROUP BY): 문법과 구조

데이터 그룹화(GROUP BY): 문법과 구조

SQL SELF
레벨 8 , 레슨 0
사용 가능

상상해봐, 네가 수천 개의 데이터 행을 다루고 있다고 해 — 그 안에서 의미를 어떻게 찾을 수 있을까? 여기서 GROUP BY 연산자가 등장하지! SQL 오케스트라의 진짜 지휘자라고 할 수 있어. 흩어진 데이터를 딱 맞는 멜로디로 바꿔주지: 세고, 그룹화하고, 요약해줘. 각 고객이 몇 번 주문했는지, 각 코스에 학생이 몇 명인지, 부서별로 월급이 어떻게 분포되는지 알고 싶어? 이 모든 게 GROUP BY의 역할이야. 오늘은 이 녀석과 친해지고, 테이블에서 최대한 이득을 뽑아내는 방법을 알아볼 거야.

그룹화란, 하나 이상의 컬럼에서 같은 값을 가진 행들을 논리적인 그룹으로 묶는 과정이야. 이렇게 하면 각 그룹마다 집계 함수를 따로 적용할 수 있어.

예를 들어, 직원 테이블이 있는데 각 부서별로 평균 월급을 알고 싶다고 해. 한 부서가 한 그룹이 되는 거지. SQL은 GROUP BY로 직원 테이블을 부서별로 나누고, 각 그룹에 AVG()를 적용해줘.

GROUP BY 문법

SQL에서 그룹화를 쓸 때 가장 중요한 규칙: GROUP BY를 쓰면, 집계 함수에 들어가지 않은 모든 컬럼은 GROUP BY에 꼭 써줘야 해.

문법:

SELECT 컬럼1, 
       집계_함수(컬럼2)
FROM 테이블
GROUP BY 컬럼1;

작동 단계:

  1. 어떤 컬럼으로 데이터를 그룹화할지 GROUP BY에 적어.
  2. 그룹별로 값을 계산하려면 집계 함수를 써.
  3. 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 쓸 때 주의할 점

  1. SELECT에 들어가는 컬럼 규칙

SQL은 SELECT에 적은 컬럼 중 집계 함수(SUM(), COUNT() 등)에 안 들어간 건 전부 GROUP BY에 있어야 한다고 요구해. 그룹화 없이 SQL은 어떤 값을 보여줘야 할지 모르는 거지.

이런 쿼리를 실행하면 에러가 나와:

SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;

에러: name 컬럼이 GROUP BY에 없음. 고치려면 nameGROUP BY에 추가해야 해:

SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;

근데 이러면 학생별로 그룹이 나뉘니까, 우리가 원했던 결과랑은 좀 달라.

  1. 여러 컬럼으로 그룹화하기

한 컬럼만이 아니라 여러 컬럼으로도 그룹화할 수 있어. 예를 들어, 학부뿐 아니라 학생 이름별로도 그룹화하고 싶으면, 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
  1. 여러 집계 함수로 그룹화하기

집계 함수 하나만 쓸 필요 없어! 예를 들어, 학부별 학생 수와 평균 학점을 같이 구하고 싶으면 이렇게 하면 돼:

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 테이블의 학생들을 facultygender 값이 같은 그룹으로 나눠. 각 그룹의 학생들은 facultygender가 같으니까, 그룹 자체에 facultygender 속성이 있다고 할 수 있어. 하지만 여전히 그룹에는 하나의 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;

근데 agehigh를 그냥 SELECT에 쓰는 건 안 돼.

GROUP BY 쓸 때 흔한 실수들

GROUP BY로 쿼리를 짜기 시작하면, 이런 함정들이 있을 수 있어:

  1. SELECT에 모든 컬럼을 안 썼을 때. 집계 함수가 아닌 컬럼은 전부 GROUP BY에 있어야 해. 안 그러면 SQL이 뭘 보여줘야 할지 몰라.

  2. NULL로 그룹화. NULL 값은 따로 그룹으로 취급돼. 컬럼에 NULL이 있으면, SQL이 NULL 그룹을 만들어.

  3. 불필요하게 많은 그룹. GROUP BY에 컬럼을 너무 많이 넣으면, 결과가 너무 세분화돼서 분석하기 힘들어질 수 있어.

이제 GROUP BY로 데이터를 효과적으로 그룹화하는 방법을 알게 됐지! SQL에서 가장 강력한 도구 중 하나라서, 집계 데이터 다루고 구조화된 리포트 만들 때 엄청 유용해. 다음엔 HAVING으로 추가 필터를 거는 방법까지 더 깊게 파고들어볼 거야.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION