개발

[데이터베이스]: SQL 데이터 그룹화와 필터링에 대해 알아보기

Funital01 2026. 4. 21. 11:34
목록

1. GROUP BY

2. HAVING

3. LIMIT

 

데이터를 조회하다 보면, 특정 기준으로 데이터를 묶어서 통계를 내고 싶은 경우가 많습니다.

이때 사용하는 대표적인 기능이 바로 GROUP BY입니다.

 

GROUP BY

특정 컬럼을 기준으로 데이터를 그룹화시켜주는 것이 바로 GROUP BY입니다.

주로 집계함수와 함께 사용이 되는데요.

 

🧐 여기서 집계함수는 COUNT, MAX, MIN, SUM, AVG와 같이

데이터를 숫자적으로 요약해주는 함수들을 의미합니다.

예를 들어 “고객별 주문 수”, “부서별 평균 급여”와 같은 통계를 구할 때 자주 활용됩니다.

 

1개 이상의 속성에 대해서 그룹핑을 할 수 있고,SELECT 절에서는 GROUP BY에 쓰인 속성만 사용이 가능합니다.

 

기본적인 구조는 다음과 같습니다.

SELECT 그룹기준속성, 집계함수(속성이름)
FROM 테이블이름
GROUP BY 그룹기준속성;

 

그렇다면 예시를 통해 확인을 해봅시다.

orderid custid bookid saleprice orderdate
1 1 1 6000 2024-07-01
2 1 6 8000 2024-07-03
5 2 6 8000 2024-07-06
6 3 4 2000 2024-07-09
4 3 3 1000 2024-07-10
3 3 2 4000 2024-07-20

 

 

다음과 같이 Orders 테이블이 있다고 한다면, 이때 고객별로 주문한 도서의 총 수량과 총 판매액을 구한다면 어떻게 해야할까요?

SELECT custid, COUNT(*) AS 도서수량, SUM(saleprice) AS 총액
FROM Orders
GROUP BY custid;

 

고객 별로 주문한 도서이기 때문에, 고객을 하나의 그룹으로 묶어줘야겠죠?

이어서, 각 도서수량과 총액은 집계함수를 통해 구할 수가 있었습니다.

 

custid 도서수량 총액
1 2 14000
2 1 8000
3 3 7000

 

그래서 다음과 같은 GROUP BY에 의한 결과물이 나오게 됩니다.

 

 

여기서 주의할 점이 있습니다. GROUP BY를 사용할 때

SELECT 절에는 그룹 기준이 되는 컬럼과 집계 함수만 사용할 수 있습니다. 

SELECT 절과는 달리 ALIAS 명을 사용할 수 없어요!

 

또한 실행 순서상 WHERE 절이 GROUP BY보다 먼저 수행되기 때문에,

WHERE 절에서는 집계 함수를 사용할 수 없습니다.

 

이 점을 유의해서 사용하시면 좋을 것 같아요.😮

 

 

HAVING

우리가 SELET를 할때 조건을 걸고 싶다면 WHERE 절을 사용을 했었는데요,

그렇다면 그룹화에 대한 조건을 걸고 싶을 때는 어떻게 해야할까요?

 

바로 HAVING 절을 사용하면 되는데요.

HAVING은 그룹화한 결과에 조건을 걸고자 할때 사용을 합니다.

이때, 집계함수와 함께 조건을 사용할 수가 있어요.

 

기본적인 구조는 다음과 같습니다.

SELECT 그룹기준속성, 집계함수(속성이름)
FROM 테이블이름
GROUP BY 그룹기준속성
HAVING 집계함수(속성이름) 조건식;

 

위의 Orders 테이블을 가지고 다시 한번 살펴보겠습니다.

<Orders>

 

만약 “가격이 4000원 이상인 도서를 구매한 고객 중에서, 2권 이상 구매한 고객만 조회”하자고 한다면 어떻게 할까요?

 

여기서 헷갈리기 쉬운 부분은
‘가격이 4000원 이상인 도서를 구매한 고객’과
‘2권 이상 구매한 고객’이라는 두 조건 중,
어떤 조건이 행을 필터링하는 조건(WHERE)이고,
어떤 조건이 그룹화된 결과를 필터링하는 조건(HAVING)인지 구분하는 것입니다.

 

문제를 해결할 때는 먼저 어떤 기준으로 그룹화를 할지를 판단해야 하는데요.
문장에서 “고객별 주문 도서”라고 제시되어 있으므로, 

고객(custid)이 그룹화 기준이 됩니다.

 

그 다음은 조건을 어디에 적용할지 구분하는 단계입니다.
조건을 살펴보면,
‘가격이 4000원 이상인 도서’는 개별 행에 대한 조건이고,
‘2권 이상 구매한 고객’은 그룹화된 결과에 대한 조건입니다.

 

따라서,
개별 데이터를 필터링하는 조건은 WHERE 절에,
그룹 결과를 필터링하는 조건은 HAVING 절에 작성해야 합니다.

 

즉,
WHERE 절에는 saleprice >= 4000을,
HAVING 절에는 
COUNT(*) >= 2를 작성하면 되겠죠?

 

SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 4000
GROUP BY custid
HAVING COUNT(*) >= 2;

 

그래서 다음과 같이 쿼리를 작성해줄 수 있었습니다.

 

custid 도서수량
1 2

 

먼저, 가격이 4000원 이상인 도서만 필터링한 뒤 고객별로 그룹화하고,

그 중에서 2권 이상 구매한 고객만 선택하면 다음과 같은 결과가 출력됩니다.

 

 

정리하자면,
WHERE는 그룹화 이전에 행을 필터링하고,
HAVING은 
그룹화 이후에 결과를 필터링하는 역할이라고 생각하면 쉬울 것 같아요.

HAVING은 일반적으로 GROUP BY와 함께 사용해주셔야합니다!🤔

 

LIMIT

LIMIT은 조회 결과의 개수를 제한할 때 사용하는 구문입니다.
데이터의 양이 많은 테이블을 단순 조회하게 되면,

수천 개 이상의 행이 한 번에 출력되서 결과를 확인하기가 매우 불편해질 수 있습니다.

 

특히 개발 과정 내에서 전체 데이터를 모두 확인하기보다는,

일부만 빠르게 확인하는 것이 훨씬 효율적인 경우가 많습니다.

 

이럴 때 LIMIT을 사용하면, 원하는 개수만큼의 결과만 조회할 수 있어서

작업 효율을 크게 높일 수 있어요.

 

기본적인 구조는 다음과 같습니다.

SELECT 속성이름(혹은 *)
FROM 테이블이름
LIMIT 제한개수;

 

예를 들어, 테이블의 상위 20개 데이터만 확인하고 싶다면 

LIMIT 20을 사용해서 전체 출력 없이 필요한 데이터만 빠르게 확인할 수 있습니다.

 

추가적으로 LIMIT에는 두 개의 숫자를 함께 사용할 수도 있습니다.

LIMIT 시작위치, 제한개수

 

특정 위치부터 원하는 개수만큼의 데이터만 조회하겠다는 의미를 가지고 있는데요,

앞에 작성한 시작 위치만큼의 행은 건너뛰고,

그 이후의 데이터부터 지정한 개수만큼만 출력됩니다.

 

 LIMIT 5, 10


예를 들어 LIMIT절에 5, 10이라고 작성하면,

처음 5개의 행을 제외하고 그 다음 행부터 10개의 데이터만 조회하게 됩니다.

이 방식은 페이지 단위로 데이터를 나누어 조회하는 페이징 처리에서 자주 사용할 수 있어요.

 

즉, LIMIT은 데이터의 전체적인 구조를 파악하거나,

쿼리 결과를 미리 테스트해보고 싶을 때 유용하게 활용될 수 있습니다.

 

대량의 데이터 환경에서 전체 데이터를 조회하는 것은 성능에 부담을 줄 수 있기 때문에

상황에 맞게 LIMIT을 활용해서

일부 데이터만 조회하는 습관을 들이는 것도 좋을 것 같습니다.🙂