반응형
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 BY는 GROUP BY 이후에 적용됨.
- 기본 정렬 방식은 ASC(오름차순)이며, DESC를 명시하면 내림차순 정렬됨.
- 다중 컬럼을 기준으로 정렬할 수 있으며, 우선순위가 높은 컬럼부터 지정해야 함.
반응형
'자격증 > SQLD' 카테고리의 다른 글
Part 4: SQL 활용 (Advanced SQL Usage) (0) | 2025.02.16 |
---|---|
[SQLD] 3-3: JOIN (조인)의 모든 것 (0) | 2025.02.16 |
[SQLD] 3-1: SELECT 와 WHERE(feat. 연산자 & 함수 & 조건문) (0) | 2025.02.15 |
[SQLD] Part 3: SQL 기본 (1) | 2025.02.14 |
[SQLD] 2-2: 트랜잭션(Transaction)/ 널(NULL) / (0) | 2025.02.14 |