오늘도 평소와 같이 복습과 연습의 목적으로 SQL 문제 몇 개를 풀어보는 시간을 가졌다. 그런데 오늘은 내가 아는 것 만으로는 도저히 풀 수 없는 문제가 있었고 Having 절이라는 새로운 것을 알게 되었다. 그에 대해 간략히 정리해보았다.
1. Where와 Having
Where와 Having 절은 모두 특정 조건으로 필터링을 할 때 사용된다는 공통점이 있지만 큰 차이가 있다.
먼저 Where는 모든 행에 대해 조건을 만족하는지 검사하고 만족하지 않는 행을 걸러낸다.
반면 Having은 그룹 전체 즉, 그룹을 나타내는 결과 집합의 행에서만 조건을 검사하고 걸러낸다. 그룹화와 집계화가 이루어진 뒤에 결과를 필터링한다.
SQL 구조의 순서는 다음과 같다. Having은 Group by 뒤에 등장한다는 것을 꼭 기억해야한다.
Select
From
Where
Group by
Having
Order by
Having을 한 번 사용해보자
다음은 음식 주문들의 상세가 적혀있는 테이블에서 음식 타입별로 주문이 들어온 음식 가격들의 총합을 구하는 SQL문이다.
select cuisine_type '음식 타입', sum(price) '음식 가격 총합'
from food_orders
group by cuisine_type
결과
Having을 이용해 음식 가격 총합이 1000000이 넘는 음식 타입의 음식 가격 총합을 출력해보았다.
select cuisine_type '음식 타입', sum(price) '음식 가격 총합'
from food_orders
group by cuisine_type
having sum(price) >= 1000000
실행 결과
Having을 쓰지 않고도 서브쿼리를 이용하여 위와 똑같은 결과를 출력하는 것도 가능은 하다. 하지만 위의 결과를 활용해 다시 쿼리문을 작성해야할 경우도 생길 수 있기 때문에 having을 사용하는 것이 훨씬 깔끔하고 좋다.
select cuisine_type '음식 타입', sum '음식 가격 총합'
from
(select cuisine_type, sum(price) sum
from food_orders
group by cuisine_type
) a
where sum >= 1000000
사용을 해보면 having이 group by 절 아래에 있는 것이 너무나도 당연하다. 그룹화와 집계화를 끝낸 뒤에 조건이 따라 붙어야 하기 때문이다.
진즉 알았더라면 참으로 편했을텐데라는 생각과 함께 내가 미처 모르는 유용한 것들이 없는지 더 찾아봐야 겠다고 생각했다.
2. 오늘 알게된 것
- SQL에서 Having의 사용 방법을 알아보았다.
- 웹 개발 전반을 아우르는 CS 지식에 대해 공부하고 정리해보았다.
'오늘 배운 것' 카테고리의 다른 글
24-03-24 라이브러리와 프레임워크, 플러그인 (0) | 2024.03.24 |
---|---|
24-03-23 SQL UNION과 UNION ALL (0) | 2024.03.23 |
24-03-21 Kotlin 컬렉션 필터링하기 filter(), filterIndexed() ... (0) | 2024.03.21 |
24-03-20 Kotlin Pair와 Zip (2) | 2024.03.20 |
24-03-19 Kotlin 원시배열과 참조배열 (2) | 2024.03.19 |