작성
·
57
0
안녕하세요. 풀이중에 궁금한 것이 있어서 질문 납깁니다.
연습문제 28번에 2가지 방식의 쿼리문을 설명해주셨는데요, 결과값이 각각 43 row, 42 row로 반환이 되어 다른 것 같습니다. 이럴 경우 두가지 방식 중에 어떤 것이 더 확실한 방법일까요?
답변 3
0
추가로, 해당 쿼리를 다시 한번 생각해보니 놓친 부분이 있는 것 같습니다. ANSWER 자료에 있는 쿼리문은 이상이 없고요. 영상에서 WHERE 와 HAVING 둘다를 쓴 쿼리는 WHERE 절을 빼야할 것 같습니다. 이 부분은 출장을 마친 후, 업데이트하고 새소식으로 공유드리겠습니다. 불편을 드려 죄송합니다.
감사합니다.
0
안녕하세요. 답변 도우미입니다.
두가지 풀이가 살짝 좀 어떤 것인지 정확히는 기억이 애매한데요. 다음과 같은 부분이 답변이 될지 모르겠습니다. 혹시 아니시면 dream@fun-coding.org 로 두 가지 풀이와 의견을 보내주시면, 제가 지금 해외에 있어서, 금주 말까지 답변드리겠습니다. 감사합니다.
연습문제 28번에 제시된 두 가지 SQL 쿼리에서 결과가 다르게 나오는 이유는 다음과 같은 차이 때문입니다.
1. 첫 번째 쿼리 (`LEFT JOIN`과 HAVING COUNT(r.rental_id) = 0
):
- 이 쿼리는 각 영화(`film`)에 대해 대여된 적이 없는 경우를 찾기 위해 LEFT JOIN
을 사용합니다.
- rental_id
가 NULL
인 경우만을 찾으면서, GROUP BY
로 영화 타이틀을 그룹화한 후, HAVING COUNT(r.rental_id) = 0
으로 대여 기록이 전혀 없는 영화를 필터링합니다.
- 그러나 이 방식은 영화에 속한 모든 inventory(재고)가 대여되지 않은 경우를 찾기 때문에, 일부 inventory가 대여된 영화는 결과에서 제외됩니다.
2. 두 번째 쿼리 (`NOT IN` 서브쿼리 방식):
- 이 쿼리는 서브쿼리를 사용하여 대여된 적이 있는 영화(film_id)를 먼저 찾고, 그 영화들이 아닌 영화들을 찾습니다.
- SELECT DISTINCT(I.film_id)
서브쿼리에서는 한 번이라도 대여된 영화의 film_id를 추출하고, 메인 쿼리에서는 그 목록에 없는 영화를 출력합니다.
- 이 방식은 모든 inventory 중 하나라도 대여된 영화는 제외하고, 한 번도 대여되지 않은 영화만을 반환하는 방식입니다.
### 차이점 분석:
- 첫 번째 쿼리는 영화의 모든 inventory가 한 번도 대여되지 않은 경우를 찾습니다.
- 두 번째 쿼리는 한 번이라도 대여된 적이 있는 영화는 제외하고, 대여된 적이 없는 영화만을 찾습니다.
따라서, 두 번째 쿼리가 더 확실한 방법이라고 할 수 있습니다. 첫 번째 쿼리는 영화가 여러 개의 inventory를 가질 때 일부만 대여된 경우를 제외하지 못할 가능성이 있기 때문입니다. 이로 인해 결과가 다르게 나올 수 있습니다.
감사합니다.
잔재미코딩 드림
0
안녕하세요, 인프런 AI 인턴입니다. 둥절둥절님.
연습문제 28번 관련 질문해 주셔서 감사합니다. 관련된 질문에 대한 유사한 답변들은 아래 링크에서 찾아보실 수 있습니다:
SQL 쿼리에 따라 다르게 반환되는 결과는 주로 JOIN 조건이나 GROUP BY 절에 의해 영향을 받을 수 있습니다. 두 쿼리 중 어느 것이 더 확실한 방법인지 판단하기 위해서는 데이터 구조와 쿼리의 목적을 제대로 이해할 필요가 있습니다. 예를 들어, 그룹핑한 컬럼의 차이, JOIN 조건의 차이 등을 고려해야 합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.