본문 바로가기
자격증/SQLD

[SQLD] 3-2: GROUP BY & HAVING & ORDER

by rnasterofmysea 2025. 2. 16.
반응형

1. GROUP BY 개념

GROUP BY 절은 데이터를 특정 기준에 따라 그룹화하여 집계 연산을 수행할 때 사용됩니다. SUM(), AVG(), COUNT(), MAX(), MIN()과 같은 집계 함수(Aggregate Function)와 함께 사용됩니다.

1.1 GROUP BY 기본 구문

SELECT 그룹화할_열, 집계함수(열)
FROM 테이블_이름
GROUP BY 그룹화할_열;

1.2 GROUP BY 예제

테이블: SALES (판매 내역)

SALE_ID  CUSTOMER_ID  PRODUCT  QUANTITY  TOTAL_PRICE
1 101 TV 1 500
2 101 PHONE 2 1000
3 102 TV 1 500
4 103 LAPTOP 1 1500
5 103 PHONE 1 500

1) 고객별 총 구매 금액 조회

SELECT CUSTOMER_ID, SUM(TOTAL_PRICE) AS TOTAL_SPENT
FROM SALES
GROUP BY CUSTOMER_ID;

 

결과:

CUSTOMER_ID  TOTAL_SPENT
101 1500
102 500
103 2000

2) 제품별 총 판매량 조회

SELECT PRODUCT, SUM(QUANTITY) AS TOTAL_SOLD
FROM SALES
GROUP BY PRODUCT;

결과:

 

PRODUCT  TOTAL_SOLD
TV 2
PHONE 3
LAPTOP 1

 

시험 유의사항:

  • GROUP BY 절에 포함된 컬럼은 반드시 SELECT 절에도 존재해야 합니다.
  • SELECT 절에서 집계 함수를 사용하지 않는 컬럼은 GROUP BY 절에 반드시 포함되어야 합니다.

잘못된 예제:

SELECT CUSTOMER_ID, TOTAL_PRICE -- (X) TOTAL_PRICE는 집계 함수가 아님
FROM SALES
GROUP BY CUSTOMER_ID;

 

올바른 예제:

SELECT CUSTOMER_ID, SUM(TOTAL_PRICE)
FROM SALES
GROUP BY CUSTOMER_ID;

2. HAVING 절

HAVING 절은 GROUP BY로 그룹화된 결과에 대한 조건을 지정할 때 사용됩니다. WHERE 절은 개별 행을 필터링하지만, HAVING 절은 집계된 결과를 필터링하는 데 사용됩니다.

2.1 HAVING 기본 구문

SELECT 그룹화할_열, 집계함수(열)
FROM 테이블_이름
GROUP BY 그룹화할_열
HAVING 조건;

2.2 HAVING 예제

테이블: SALES (판매 내역)

SALE_ID  CUSTOMER_ID  PRODUCT  QUANTITY  TOTAL_PRICE
1 101 TV 1 500
2 101 PHONE 2 1000
3 102 TV 1 500
4 103 LAPTOP 1 1500
5 103 PHONE 1 500

1) 총 구매 금액이 1000 이상인 고객만 조회

SELECT CUSTOMER_ID, SUM(TOTAL_PRICE) AS TOTAL_SPENT
FROM SALES
GROUP BY CUSTOMER_ID
HAVING SUM(TOTAL_PRICE) >= 1000;

 

결과:

 

CUSTOMER_ID TOTAL_SPENT
101 1500
103 2000

 

2) 제품별 판매량이 2개 이상인 제품만 조회

SELECT PRODUCT, SUM(QUANTITY) AS TOTAL_SOLD
FROM SALES
GROUP BY PRODUCT
HAVING SUM(QUANTITY) >= 2;

 

결과:

PRODUCT  TOTAL_SOLD
TV 2
PHONE 3

 

시험 유의사항:

  • HAVING 절은 반드시 GROUP BY와 함께 사용되며, 집계 함수가 포함된 조건을 설정해야 합니다.
  • WHERE 절은 개별 행을 필터링하고, HAVING 절은 그룹화된 데이터를 필터링합니다.

잘못된 예제:

SELECT CUSTOMER_ID, SUM(TOTAL_PRICE)
FROM SALES
HAVING TOTAL_PRICE >= 1000; -- (X) 집계 함수를 사용해야 함

 

올바른 예제:

SELECT CUSTOMER_ID, SUM(TOTAL_PRICE)
FROM SALES
GROUP BY CUSTOMER_ID
HAVING SUM(TOTAL_PRICE) >= 1000;

3. WHERE vs HAVING 차이점

구분 WHERE 절 HAVING 절

사용 시점 GROUP BY 이전 필터링 GROUP BY 이후 필터링
조건 적용 대상 개별 행 그룹화된 결과
사용 가능한 조건 일반 조건 (=, >, <, LIKE, IN) 집계 함수 (SUM(), AVG(), COUNT() 등)

WHERE와 HAVING을 함께 사용하는 예제

1) 고객별 총 구매 금액이 1000 이상인 고객 중, CUSTOMER_ID가 102 이상인 경우만 조회

SELECT CUSTOMER_ID, SUM(TOTAL_PRICE) AS TOTAL_SPENT
FROM SALES
WHERE CUSTOMER_ID >= 102
GROUP BY CUSTOMER_ID
HAVING SUM(TOTAL_PRICE) >= 1000;

4. ORDER BY 절

ORD9ER BY 절은 결과를 정렬할 때 사용되며, 기본적으로 오름차순(ASC) 정렬을 수행합니다.

  • 기본 정렬 방식은 ASC(오름차순)이며, DESC를 명시하면 내림차순 정렬됨.)

4.1 ORDER BY 기본 구문

SELECT 열_이름1, 열_이름2
FROM 테이블_이름
ORDER BY 열_이름1 [ASC|DESC], 열_이름2 [ASC|DESC];

4.2 ORDER BY 예제

테이블: SALES (판매 내역)

SALE_ID  CUSTOMER_ID  PRODUCT  QUANTITY  TOTAL_PRICE
1 101 TV 1 500
2 101 PHONE 2 1000
3 102 TV 1 500
4 103 LAPTOP 1 1500
5 103 PHONE 1 500

1) 총 구매 금액 기준 내림차순 정렬

SELECT CUSTOMER_ID, SUM(TOTAL_PRICE) AS TOTAL_SPENT
FROM SALES
GROUP BY CUSTOMER_ID
ORDER BY TOTAL_SPENT DESC;

결과:

CUSTOMER_ID TOTAL_SPENT
103 2000
101 1500
102 500

2) 제품별 총 판매량을 오름차순 정렬

SELECT PRODUCT, SUM(QUANTITY) AS TOTAL_SOLD
FROM SALES
GROUP BY PRODUCT
ORDER BY TOTAL_SOLD ASC;

결과:

PRODUCT TOTAL_SOLD
LAPTOP 1
TV 2
PHONE 3

3) 다중 정렬 기준 적용

SELECT CUSTOMER_ID, PRODUCT, SUM(TOTAL_PRICE) AS TOTAL_SPENT
FROM SALES
GROUP BY CUSTOMER_ID, PRODUCT
ORDER BY CUSTOMER_ID ASC, TOTAL_SPENT DESC;

결과:

CUSTOMER_ID PRODUCT TOTAL_SPENT
101 PHONE 1000
101 TV 500
102 TV 500
103 LAPTOP 1500
103 PHONE 500

 

시험 유의사항:

  • ORDER BYGROUP BY 이후에 적용됨.
  • 기본 정렬 방식은 ASC(오름차순)이며, DESC를 명시하면 내림차순 정렬됨.
  • 다중 컬럼을 기준으로 정렬할 수 있으며, 우선순위가 높은 컬럼부터 지정해야 함.

 

 

반응형