WHERE 절에서는 집계합수를 사용하지 못한다.
따라서 집계함수를 사용할 때 조건 비교를 하기 위해서 HAVING을 쓰게 된다. 그렇기에 HAVING의 경우 GROUP BY절과 함께 사용된다.
다음은 HAVING절을 이용한 SQL예시와 설명이다.
Q) 승하차 인원 합계가 15000 ~ 16000사이 인 시간대와 역은?
- My Solution & Answer
My Solution
AnswerSELECT station_name, boarding_time, gubun, MAX(passenger_number) max_value, MIN(passenger_number) min_value, SUM(passenger_number) sum_value FROM subway_statistics GROUP BY station_name, boarding_time, gubun HAVING SUM(passenger_number) BETWEEN 15000 AND 16000 ORDER BY 6 DESC;
SELECT station_name, boarding_time, gubun, MAX(passenger_number) max_value, MIN(passenger_number) min_value, SUM(passenger_number) sum_value FROM subway_statistics GROUP BY station_name, boarding_time, gubun HAVING SUM(passenger_number) BETWEEN 15000 AND 16000 ORDER BY 6 DESC;
- 설명
- gubun column을 HAVING 조건으로 안 넣었다.
승하차 인원이 많은거가 승차 + 합차 라고 생각하고 쿼리를 만들었는데 저자의 의도는 승강장 기준으로 잡은거라 gubun이 HAVING의 조건으로 들어간거 같다.
- gubun column을 HAVING 조건으로 안 넣었다.
WHERE VS HAVING
SQL은 굳이 왜 HAVING을 만들어야했을까? WHERE로 쓰면 안되었나?
만약 HAVING대신 WHERE쓰면 어떻게 될까❓
먼저 위의 예시를 WHERE 절로 바꾸었을 때를 먼저 보자
GROUP BY 이후에는 WHERE 절이 들어가면 안되기 때문에 오류가 발생한다.
만약 GROUP BY 전에 WHERE가 들어간다면?
SUM(passenger_number)라는 인자는 WHERE에 사용하지 못한다.
즉, 집계함수는 WHERE절을 사용하지 못한다.
왜❓
WHERE 절은 모든 레코드에 대해서 조건을 적용한다.
HAVING절은 GROUP BY절을 통해 만들어진 GROUP들에만 조건을 적용한다.
그래서 WHERE 조건절에는 집계함수를 쓸 수 없는것이다. 집계함수는 모든 레코드에 대해서 집계를 한 이후의 변수값이기 때문에 GROUP BY 이후에는 쓸 수 있지만 그 전에 쓰이는 WHERE에는 적용되지 못한다.
WHAT IF❓
WHERE와 HAVING의 차이를 알고나니깐 WHERE 절보다 HAVING이 좀 더 빠르게 QUERY를 날릴 수 있다는 생각이 들었다. 조건을 거는 범위가 HAVING이 좀 더 좁기 때문이다. 이에 대한 실험을 진행해보겠다
WHERE를 사용하는 경우
HAVING을 사용하는 경우
역시 HAVING절이 WHERE 절 보다 빠르게 쿼리에 대한 결과를 볼 수 있음을 알 수 있었다.
본 글은 '누구나 쉽게 SQL'이라는 책을 읽고 정리한 내용입니다.
http://www.yes24.com/Product/Goods/74311553
더 많은 내용을 알고 싶은 분은 위의 책을 보시길 바랍니다.
긴 글 읽어주셔서 감사합니다.
틀린 부분이 있으면 댓글을 달아주시면 감사하겠습니다.
📧 : may3210@g.skku.edu
'개발 > Oracle' 카테고리의 다른 글
[Database] 테이블 간 관계 맺기 - 내부 조인 (0) | 2022.02.15 |
---|---|
[Database] 집합 쿼리 (0) | 2022.02.15 |
[Database] 데이터 집계 - GROUP BY (0) | 2022.02.15 |
[DataBase] SQL 연산자와 함수 (0) | 2022.02.15 |
[Database] 데이터 조회, SELECT 문 (0) | 2022.02.14 |