2024. 12. 26. 00:25ㆍ[SQL]
SQL에서 조건을 걸 때 적용 위치와 용도에 따라 WHERE과 HAVING을 선택하여 사용한다.
WHERE
SELECT 필드명 FROM 테이블명 WHERE 조건절;
- 적용 위치 : 데이터를 그룹화(GROUP BY)하기 전 사용
우선적으로 모든 필드에 조건 제공
- 용도 : 개별 행(row)을 필터링
- 사용 가능 대상 : 일반 컬럼이나 테이블 값에 조건 지정
집계함수(ex. COUNT, SUM, AVG)에는 사용 불가
HAVING
SELECT 필드명 FROM 테이블명 GROUP BY 필드명 HAVING 조건절;
- 적용 위치 : 데이터를 그룹화(GROUP BY)한 후, 그룹화 된 결과에 조건 제공 시 사용
- 용도 : 그룹화 된 데이터 필터링
- 사용 가능 대상 : 집계 함수와 그룹화된 컬럼에 대해 조건 지정
요약
특징 | WHERE | HAVING |
적용 시점 | 그룹화 전 | 그룹화(GROUP BY) 후 |
적용 대상 | 개별 행(전체 테이블 대상) | 그룹화 된 데이터 |
집계 함수(COUNT, AVG 등) 사용 여부 | 지원하지 않음 | 지원 (집계 결과에 조건 가능) |
예제
ORDERS 테이블
ORDER_ID | CUSTOMER_ID | AMOUNT |
1 | 101 | 200 |
2 | 102 | 300 |
3 | 101 | 150 |
4 | 103 | 500 |
5 | 101 | 50 |
1. AMOUNT가 100보다 큰 데이터 필터링
- 개별 행을 기준으로 확인하기 때문에 WHERE절 사용
SELECT CUSTOMER_ID, AMOUNT
FROM ORDERS
WHERE AMOUNT > 100;
CUSTOMER_ID | AMOUNT |
101 | 200 |
102 | 300 |
101 | 150 |
103 | 500 |
2. CUSTOMER_ID별 합산 AMOUNT가 300보다 큰 그룹 필터링
- 그룹화 된 데이터를 기준으로 확인하기 때문에 GROUP BY & HAVING 사용
SELECT CUSTOMER_ID, SUM(AMOUNT) AS TOTAL_AMOUNT
FROM ORDERS
GROUP BY CUSTOMER_ID
HAVING SUM(AMOUNT) > 300;
CUSTOMER_ID | TOTAL_AMOUNT |
101 | 400 |
103 | 500 |
3. AMOUNT가 100보다 큰 데이터에서 CUSTOMER_ID별 합산 AMOUNT가 300보다 큰 그룹 필터링
- WHERE 절과 GROUP BY & HAVING 모두 사용
SELECT CUSTOMER_ID, SUM(AMOUNT) AS TOTAL_AMOUNT
FROM ORDERS
WHERE AMOUNT > 100 -- 그룹화 전에 각 행에서 조건을 적용
GROUP BY CUSTOMER_ID
HAVING SUM(AMOUNT) > 300; -- 그룹화 후, 집계 결과에 조건을 적용
동작 과정
1) WHERE로 AMOUNT > 100인 행만 선택
CUSTOMER_ID | AMOUNT |
101 | 200 |
102 | 300 |
101 | 150 |
103 | 500 |
2) GROUP BY로 CUSTOMER_ID별 AMOUNT를 합산
CUSTOMER_ID | TOTAL_AMOUNT |
101 | 350 |
102 | 300 |
103 | 500 |
3) HAVING으로 SUM(AMOUNT) > 300 조건 적용
CUSTOMER_ID | TOTAL_AMOUNT |
101 | 350 |
103 | 500 |
'[SQL]' 카테고리의 다른 글
[SQL] COALESCE (1) | 2024.12.27 |
---|---|
[SQL_Programmers] 재구매가 일어난 상품과 회원 리스트 구하기 (0) | 2024.12.26 |