Algorithms/프로그래머스

[Python] 프로그래머스 Lv4. 서울에 위치한 식당 목록 출력하기 (SQL WHERE/HAVING)

떼닝 2024. 8. 13. 17:56

[Python] 프로그래머스 Lv4. 서울에 위치한 식당 목록 출력하기 (SQL WHERE/HAVING)

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131118

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

기록의 이유...

막 어려운 문제는 전혀 아니었는데 테케 고려를 안 해서 질문하기까지 봤던 ㅎㅎ

나는야 셀렉트 마스터

 

한번에 통과하지 못했던 이유는 "서울특별시에 위치한 식당"이면 그냥 '%서울%'로 하면 되겠지~ 했던 ㅎㅎ

하지만 주소 중간에 약간 ~~~시 ~~~구 서울로~ 라는 데이터가 있었던 건지, '서울%'로 수정하니 통과가 됐다 (질문하기 선생님 감사합니다)

 

뭐 아무튼~ 왜 기록을 하게 되었냐면 그냥 문득 궁금증이 생겼다

 

동일한 결과를 내보낸다고 할 때, WHERE과 HAVING 둘 중 어느 것이 더 효율적일까?

 

일단은 WHERE과 HAVING의 차이를 먼저 구분해야겠지~~ (나는 알지만~~0.<)

 

HAVING은 그룹 전체에만, 즉 GROUP BY를 사용하여 나타낸 그룹의 결과 집합의 행에,

WHERE은 개별 행에 적용된다.

 

WHERE은 row 단위로 수행되기에 column 단위로 적용되는 집계 함수(MIN, MAX, COUNT, ...)를 적용할 수 없지만,

HAVINGgroup 단위로 수행되기에 집계 함수를 적용할 수 있다.

 

WHERE은 다이어그램 창의 테이블 또는 테이블 반환 개체의 개별 행에 먼저 적용되고,

그 이후 집합의 행에 HAVING절이 적용된다. (HAVING 사용 위해서는 무조건 GROUP BY 존재해야 함)

 

아래는 위의 문제를 풀 때 사용한 쿼리이다.

둘 다 수행했을 때 통과되는 것을 확인할 수 있었다.

 

# HAVING 사용
SELECT INFO.REST_ID, INFO.REST_NAME, INFO.FOOD_TYPE, INFO.FAVORITES, INFO.ADDRESS, ROUND(AVG(RVW.REVIEW_SCORE), 2) SCORE
FROM REST_INFO INFO JOIN REST_REVIEW RVW ON INFO.REST_ID = RVW.REST_ID
GROUP BY INFO.REST_ID, INFO.REST_NAME, INFO.FOOD_TYPE, INFO.FAVORITES, INFO.ADDRESS
HAVING INFO.ADDRESS LIKE '서울%'
ORDER BY SCORE DESC, INFO.FAVORITES DESC
# WHERE 사용
SELECT INFO.REST_ID, INFO.REST_NAME, INFO.FOOD_TYPE, INFO.FAVORITES, INFO.ADDRESS, ROUND(AVG(RVW.REVIEW_SCORE), 2) SCORE
FROM REST_INFO INFO JOIN REST_REVIEW RVW ON INFO.REST_ID = RVW.REST_ID
WHERE INFO.ADDRESS LIKE '서울%'
GROUP BY INFO.REST_ID, INFO.REST_NAME, INFO.FOOD_TYPE, INFO.FAVORITES, INFO.ADDRESS
ORDER BY SCORE DESC, INFO.FAVORITES DESC

 

 

결과적으로, 그럼 둘 중 어느 것을 사용했을 때 더 효율적일까? 에 대한 답변은...

-> 일단은 집계 함수의 사용 여부를 따져봐야 하고,

-> 해당 속성에 대해 집계 함수를 사용하지 않을 때에는 WHERE절로 먼저 제거하는 것이 더 좋을 것 같다

 

WHERE절이 더 먼저 수행되기 때문에, 

이후의 GROUP BY나 기타 작업들에 있어서의 데이터 양을 미리 줄일 수 있을 것이라고 생각한다.

 

 

뭐... 이것도 데이터가 왕왕 크거나 할 때 좀 적용이 되는 문제이지 않을까 싶다

사무실에서 사용하고 있는 쿼리는 보통 어떤 형태로 진행하고 있는지,

큰 데이터에 대한 수행 시간도 한 번 측정해봐야겠다 ㅎㅎ

 

 

참조 : https://learn.microsoft.com/ko-kr/sql/ssms/visual-db-tools/use-having-and-where-clauses-in-the-same-query-visual-database-tools?view=sql-server-ver16