[Python] 프로그래머스 Lv4. 서울에 위치한 식당 목록 출력하기 (SQL WHERE/HAVING)
[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, ...)를 적용할 수 없지만,
HAVING은 group 단위로 수행되기에 집계 함수를 적용할 수 있다.
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나 기타 작업들에 있어서의 데이터 양을 미리 줄일 수 있을 것이라고 생각한다.
뭐... 이것도 데이터가 왕왕 크거나 할 때 좀 적용이 되는 문제이지 않을까 싶다
사무실에서 사용하고 있는 쿼리는 보통 어떤 형태로 진행하고 있는지,
큰 데이터에 대한 수행 시간도 한 번 측정해봐야겠다 ㅎㅎ