OUTER JOIN 에서 ON 절과 WHERE 절 차이 0 3 2,332

by 열정가이 [SQL Query] ON WHERE OUTER JOIN [2018.12.31 19:36:32]


Q1.JPG (51,612Bytes)
Q2.JPG (122,107Bytes)
q3.JPG (62,658Bytes)
Q4.JPG (132,038Bytes)
Q5.JPG (79,941Bytes)

ON 절은 JOIN 조건이며, WHERE 절은 검색조건으로 알고 있으며, OUTER JOIN 에서는 ON 절과 WHERE 절에 따라 결과가 다를 수 있다고 알고있습니다.
이 점에 대해 정확하게 이해하기 위해 공부를 진행하던 중 이해가 안되는 부분이 있어 이렇게 글을 남깁니다.

 

구매 내역을 저장하는 BUY_HIS 라는 테이블과 제품 정보를 저장하는 PRODUCT_TABLE을 가지고 공부를 하고 있었습니다.

 

SELECT B.BUY_TIME, B.USER_CODE, B.COUNT, B.PRICE AS SUM_PRICE, P.PRODUCT_CODE, P.PRODUCT_NAME, P.PRICE
FROM BUY_HIS B, PRODUCT_TABLE P
WHERE B.PRODUCT_CODE(+) = P.PRODUCT_CODE
AND P.PRICE <= 5000;

 

그리고 위의 쿼리를 실행 했을 때 실행계획을 보고 제가 판단한 결과는 다음과 같습니다.

JOIN이 이뤄지기 전먼저 PRODUCT_TABLE을 가져오는 WHERE 조건이 먼저 실행되어, PRICE가 5000미만의 값들만 가져오게 되는 것이고, 그 후에 JOIN 이 이뤄지기 때문에 결과도 5000미만의 값들이 OUTER JOIN되어 원하는 결과값을 가져올 수 있었습니다.

 

그리고 다음 쿼리를 실행하니 아예 5000 미만에 대한 JOIN 조건이 무시되는걸 볼 수 있었습니다.

 

SELECT B.BUY_TIME, B.USER_CODE, B.COUNT, B.PRICE AS SUM_PRICE, P.PRODUCT_CODE, P.PRODUCT_NAME, P.PRICE
FROM BUY_HIS B RIGHT OUTER JOIN PRODUCT_TABLE P
ON B.PRODUCT_CODE = P.PRODUCT_CODE
AND P.PRICE <= 5000

 

실행계획을 보니 먼저 조인이 이뤄지고 그 후에 filter 작업에서 
P.PRICE <= CASE WHEN (B.PRODUCT_CODE (+) IS NOT NULL) THEN 5000 ELSE 5000 END
라고 되어 있던데, 결국 P.PRICE <= 5000 아닌가요?

그렇다면 제가 생각했을 때는 ON은 JOIN 조건이기 때문에 서로 PRODUCT_CODE 값이 같으면서 P.PRICE <= 5000 인 로우에 대해서 조인이 발생한다고 이해하려고 하는데 결과 값은 PRICE 값이 5000 이상인 값도 나오는걸 볼 수 있었습니다...

그래서 제가 이해가 되지 않는 점은

1. 왜 ON 절에 P.PRICE <= 5000 은 무시가 되는 것일까?

2. 그리고 항상 JOIN 보다 WHERE 절이 먼저 이뤄지는 것인가?

입니다....

아직 사회 초년생이라 모르는게 너무나 많습니다... 자세하게 알려주신다면 정말 너무 감사하겠습니다...ㅠ

by 오로라 [2019.01.01 16:12:07]

ON 절은 OUTER, 즉 BUY_HIS 테이블의 데이터 중 조인에 참여할 대상을 제한하는 용도로 사용되는 겁니다.

결과론적으로 보면 PRODUCT_TABLE의 PRICE가 5000 이하인 것만 OUTER 조인을 허용하겠다는 말 입니다.

 


by 마농 [2019.01.02 11:09:44]

1. ON 절의 조건은 무시되는가?
 - WHERE 절에 있을 때는 검색조건으로 쓰여서 5천 이하만 검색됩니다.(4건 중 1건 조인)
 - ON 절에 있을 때는 조인조건으로 쓰여서 5천 이하만 조인됩니다.(8건 중 1건 조인)
 - 즉, P 집합 전체가 다 나오고(8건), 그중 5천 이하(4건)에만 B 가 붙는 것(1건)입니다.
 - 두번째 쿼리의 5천 이하 조건을 뺐을 때의 결과 차이를 확인해 보세요.(8건 중 2건 조인)
2. JOIN 과 WHERE 의 수행 순서는?
 - 그때 그때 달라요.


by 꼬랑지 [2019.01.02 14:32:02]

두번째쿼리에서 AND P.PRICE <= 5000 조건이 무시되었다고 말씀하시는데 절대 무시된게 아닙니다.

PRICE 가 5000보다 큰 데이타가 출력되지만 BUY_HIS 의 정보는 P.PRICE <= 5000 조건을 만족하는 데이타만 출력될 것입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입