[SQL 조건] WHERE과 HAVING

2024. 12. 26. 00:25[SQL]

SQL에서 조건을 걸 때 적용 위치와 용도에 따라 WHEREHAVING을 선택하여 사용한다.

 

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