[MySQL] Left outer join에서 on 과 where 의 차이점
유용한정보/프로그램 2010/02/08 16:39
A안
====================================
USE pubs
SELECT *
FROM titles AS t LEFT OUTER JOIN sales AS s
ON t.title_id = s.title_id
WHERE s.stor_id = '7066'
====================================
B안
====================================
USE pubs
SELECT *
FROM titles AS t LEFT OUTER JOIN sales AS s
ON t.title_id = s.title_id
AND s.stor_id = '7066'
====================================
어제 답글을 달려고 했는데 시간이 안나서 오늘 답니다 ^^;;
inner join은 대부분 다 아실거 같아서 얘기 안하고요.(inner join도 필요하면 얘기해주죠 ㅋㅋㅋ)
일단 left outer join에 대해 간단히 얘기하면 아래와 같습니다.
left outer join 은 항상 왼쪽 테이블의 내용을 다 반환한 다음에 on의 조건에 따라
오른쪽 테이블과 join하고 오른쪽 테이블에 없는 내용일 경우 null을 반환하고
on 조건에서 필터링한 후에 동일한 결합키가 복수개의 레코드로 존재할 경우
(n-1) 개수씩 레코드가 더 늘어납니다.
그런 다음에 where 절을 통해 필터링한 다음 결과를 반환합니다.
위의 내용을 숙지하고 답을 달자면,
A안은 titles 테이블의 모든 행을 나열한 다음 on의 조건을 겁니다.
sales 테이블에 해당 title_id가 없을 경우 null로 반환됩니다.
즉 titles 테이블이 나오고 옆에 sales 테이블의 내용들은 null로 채워지겠죠.
그리고 또하나 sales테이블에서 동일한 title_id가 복수개일 경우 (n-1) 개수씩
레코드가 더 늘어납니다.
이러한 결과 집합을 만든 다음에 where 절을 통해 다시 필터링을 합니다.
s.stor_id = '7066'이 조건에 맞는것만 뿌려주겠죠.
B안은 A안과 마찬가지로 titles 테이블의 모든 행을 나열한 다음 on의 조건을 겁니다.
t.title_id = s.title_id AND s.stor_id = '7066'
조건에서 필터링 되는것들은 sales 테이블의 컬럼들이 null로 반환됩니다.
(s.stor_id = '7066'인 경우를 제외하고 나머지는 null로 채워지겠죠 ^^)
이경우 기본적으로 titles테이블이 전부 나열되고 sales테이블에서 동일한 title_id가
여러개일 경우 (n-1) 개수만큼 레코드가 더 늘어납니다.
(s.stor_id = '7066'인 sales 테이블에서 title_id가 여러개에 해달될 때겠죠 ^^)
=========================================================
우리가 join을 사용할때 주의해야 할 사항이 있습니다.
우리가 left outer join을 거는 경우는 대부분이 기본적으로 왼쪽 테이블의 내용을 뿌려주고
그옆에 오른쪽의 테이블 내용을 뿌려주려고 하는것입니다.(없는경우 null이라도.....)
그런데 위와 같이 where절에 s.stor_id = '7066' 조건이 들어가니 생각했던 것과는
약간 다르게 나오죠?
이미 제대로 알고 있는 사람도 있지만 모르는 사람들이 있더라구요 ㅎㅎㅎ
왜 이런 결과가 나오는지는 위에서 설명이 다 됐죠 ㅎㅎㅎ
그런데 공교롭게도 우리가 left outer join을 걸었지만 A안과 같이 조건절에 오른쪽 테이블의
컬럼을 가지고 비교할 경우 쿼리분석기에서 Plan을 떠보면 inner join이 걸리는 경우가 많습니다.
그리고 null에 대한 체크를 반드시 명시해 주어야 합니다.
A안에서 결과는 2개를 반환합니다. 조건절을 빼면 23개의 결과을 반환하죠.
그럼 거꾸로 조건절을 WHERE s.stor_id <> '7066' 와 같이 건다면 결과는 몇개가 반환될까요?
생각대로라면 23-2=21개가 반환되어야겠죠?
그런데 실제로는 19개가 반환됩니다.
null체크에 대한 부분이 빠졌기 때문입니다.
join과 where 제대로 알고 써야 합니다.
본인도 모르는 사이에 전혀 다른 결과를 반환합니다~~~*^^*
출처: http://www.taeyo.net/Forum/Content.aspx?SEQ=26134&TBL=SQL
'유용한정보 > 프로그램' 카테고리의 다른 글
| 웹로봇 관련 사이트 (0) | 2010/02/16 |
|---|---|
| [PHP] PHP로 이미지 워터마크 구현 (0) | 2010/02/12 |
| [MySQL] Left outer join에서 on 과 where 의 차이점 (0) | 2010/02/08 |
| [JS] 기사내 특정단어 드래그시 검색 기능 (0) | 2010/01/15 |
| [MySQL] Stored Procedure 한번 만들어 보자! (0) | 2010/01/14 |
| [MySQL] Stored Procedure란? Stored Procedure 필수 요소들 (0) | 2010/01/14 |