안녕하세요 선배님들
이번에 SQL공부를 하다가 궁금한 점이 생겨서 질문드립니다.
ON절과 WHERE절에 같은 조건을 거는 경우에 대한 질문인데
검색하면서 여러 답변을 찾아보면서 더 아리송해지는 것 같아 글 올립니다.
SELECT * FROM EMP_LIST E LEFT JOIN DEPT_LIST D ON E.EMP_NO = D.EMP_NO AND D.MADE_DT > '20230101' AND D.MADE_DT < '20231231' WHERE D.MADE_DT > '20230101' AND D.MADE_DT < '20231231'
위와 같은 테이블 조인시 (각각 ON절, WHERE절이 걸린 쿼리로 구분해서 봐주세요)
ON절이 먼저 실행되면서 필터링된 DEPT_LIST 테이블이 조인된 후 WHERE 절에서 다시 한 번 걸러지는 것인지
WHERE절이 먼저 실행되면서 필터링된 DEPT_LIST 테이블의 조인과정중 ON절에서 다시 한 번 걸러지는 것인지
궁금합니다.
찾아본바로는 WHERE절에 거는 것이 성능이 더 좋은 것 같은데
빈값이 출력되는 행보다 ON절로 걸러지는 행이 많은 경우를 가정하면
ON절이 먼저 진행되면 ON절로 조인되는 개수를 줄이는게 좋지 않나요?
그리고
옵티마이저가 알아서 조정하겠지만 혹시 그렇지 않은 경우에서의 기본적인
JOIN ON WHERE 절 각각의 실행순서가 궁금합니다
ON절은 아래에서부터 실행된다고 들었어서 궁금증이 생겼습니다.
JOIN절 - 테이블 3개를 JOIN한 경우 위에서부터 아래
ON절 - ON 연결조건 AND 조건1 AND 조건2 의 경우 아래에서부터 위로
WHERE절 - 조건1 AND 조건2 AND 조건3 의 경우 앞에서부터 뒤로
이런식으로,.,
On 절이 먼저냐 Where 절이 먼저냐? 를 따지는게 아닙니다.
위가 먼저냐 아래가 먼저냐? 를 따지는게 아닙니다.
어떤 조건을 먼저 처리하는게 유리한가? 를 따지셔야 합니다.
이너조인의 경우에는 ON 절 WHERE 절 아무데나 조건 줘도 알아서 잘 돌아갑니다.
그래도 조인 조건은 ON 절에 검색조건은 WHERE 절에 적어주는게 좋습니다.
아우터 조인의 경우엔 ON 절 WHERE 절 조건의 위치에 따라 결과가 달라집니다.
따라서 어떤 결과를 원하는지에 따라 조건의 위치를 잘 선택해야 합니다.
위 쿼리는 아우터 조인이지만 이너조인 처럼 동작합니다.
쿼리를 잘못 작성한 것이죠.
- 조건을 잘못 줬을 가능성과
- 조인을 잘못 선택했을 가능성