본문 바로가기
개발 & IT & 데이터분석

[SQL SERVER] WHERE와 HAVING

by 라이프리 2021. 9. 5.

 공통점

SQL에서 WHERE와 HAVING은 모두 "조건절"이다. 검색의 대상이 되는 테이블(FROM 테이블명)의 튜플(행) 중 설정한 조건에 맞는 값만 불러오도록 명령한다.

 

 차이점

1) GROUP BY 필수 여부

- HAVING절은 GROUP BY 절의 결과로 나타나는 그룹을 제한하는 역할을 한다. 따라서, GROUP BY절이 없는 상태에서 HAVING을 사용할 수 없다.

- 그에 반해, WHERE 절은 GROUP BY가 없이도 사용 가능하다.

 

2) 속성/집계값

- HAVING절은 GROUP BY로 그룹핑한 결과값을 제어하는 역할을 하기 때문에, 입력값도 마찬가지로 집계값을 입력하여야 한다.

- WHERE절의 입력값은 단일 속성(컬럼명)만 가능하다.

3) 예시

-- 테스트 테이블 생성
CREATE TABLE Orders (
  orderid	INT  PRIMARY KEY,
  custid	INT  REFERENCES Customer(custid),
  bookid	INT  REFERENCES Book(bookid),
  saleprice INT,
  orderdate DATE
);

-- 주문(Orders) 테이블의 책값은 할인 판매를 가정함
INSERT INTO Orders VALUES (1, 1, 1, 6000, '2021-07-01'); 
INSERT INTO Orders VALUES (2, 1, 3, 21000, '2021-07-03');
INSERT INTO Orders VALUES (3, 2, 5, 8000, '2021-07-03'); 
INSERT INTO Orders VALUES (4, 3, 6, 6000, '2021-07-04'); 
INSERT INTO Orders VALUES (5, 4, 7, 20000, '2021-07-05');
INSERT INTO Orders VALUES (6, 1, 2, 12000, '2021-07-07');
INSERT INTO Orders VALUES (7, 4, 8, 13000, '2021-07-07');
INSERT INTO Orders VALUES (8, 3, 10, 12000, '2021-07-08'); 
INSERT INTO Orders VALUES (9, 2, 10, 7000, '2021-07-09'); 
INSERT INTO Orders VALUES (10, 3, 8, 13000, '2021-07-10');

-- WHERE절만 사용
SELECT
	custid
	
FROM ORDERS
WHERE saleprice >= 8000

-- WHERE/ HAVING절 동시 사용
SELECT
	custid
	,COUNT(*) AS 구매수량
FROM ORDERS
WHERE saleprice >= 8000
GROUP BY custid
HAVING COUNT(*) >=2;

 

 

참고: SQL Server로 배우는 데이터베이스 개론과 실습 2판(박우창, 남송휘, 이현룡/ 한빛아카데미)

댓글