아시는 분들은 잘 아시겠지만, 초보 분들을 위해...

LEFT OUTER JOIN 에 대해 그냥 실험하듯이 몇 가지를 해 보았습니다.

그냥 재미로 보시면 될 듯 하네요.

먼저 테이블을 두 개 만들어 보겠습니다.

CREATE TABLE dbo.TB_A

(SEQ1 INT,

DATA1 VARCHAR(1000)

);

CREATE TABLE dbo.TB_B

(SEQ2 INT,

DATA2 VARCHAR(1000)

);

SEQ1, DATA1 SEQ2, DATA2 로 되어 있는 간단한 테이블입니다.

여기에 데이터를 삽입합니다.

INSERT INTO TB_A VALUES (1,'테이블A1'), (2,'테이블A2'), (3,'테이블A3'), (4,'테이블A4'), (5,'테이블A5');

INSERT INTO TB_B VALUES (1,'테이블B1'), (3,'테이블B3'), (5,'테이블B5');

1번 테이블엔 다섯 개의 Row, 2번 테이블엔 세 개의 Row가 있습니다.

1. INNER JOIN해 보면 다음과 같습니다.

1.jpg

SELECT A.*, B.*

FROM TB_A A INNER JOIN TB_B B ON A.SEQ1 = B.SEQ2

당연히 세 개의 결과만 나오죠.

2. 그럼 LEFT OUTER JOIN에서 위와 같은 조건으로 해봅니다.

2.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2

, 첫번째 테이블의 모든 것과 두번째 테이블에서 SEQ2이 매치되는 것만 보여주죠. 당연한 이야기입니다.

3. 그럼 이제 조건을 좀 바꿔보겠습니다.

3.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2

WHERE A.DATA1 LIKE'%4'

테이블 14가 들어간 Row는 하나 뿐이므로WHERE 조건에 일치하는 것을 먼저 가져오고 나니 두 번째 테이블엔 매치되는 게 없습니다.

4. 그렇다면 저것을 JOIN 조건으로 올리게 되면 어떻게 될까요?

4.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2 AND A.DATA1 LIKE '%4'

아까랑 많이 다릅니다. 이는 일단 기본적으로 테이블1에 있는 모든 것을 가져온 뒤 조건에 맞는 것을 찾기 때문입니다.

5. 그럼, 조건에 맞는 것이 있을 때는 어떻게 될까요?

6.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2 AND B.DATA2 LIKE '%3'

이제 좀 달라졌죠? JOIN조건에 맞는 것이 없을 때와 있을 때는 위와 같이 차이가 납니다.

6. 4.번과 다른 조건으로 한 번 더 봅니다.

5.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2 AND B.DATA2 LIKE '%4'

어라? 결과가 4번과 같습니다이는 결국 테이블2에서 매치되는 조건이 없기 때문입니다.

7. 가장 주의해야 할 사항은 지금 보여드리는 쿼리입니다.

7.jpg

SELECT A.*, B.*

FROM TB_A A LEFT OUTER JOIN TB_B B ON A.SEQ1 = B.SEQ2

WHERE B.DATA2 LIKE'%3'

LEFT OUTER JOIN임에도 불구하고 두 번째 테이블의 컬럼 조건을 WHERE절에 쓰면

해당 조건에 맞는 데이터를 먼저 걸러내게 됩니다.

아마실제로 원했던 것은 5.번과 같이 먼저 첫번째 테이블의 모든 결과를 가져온 뒤, 두번째 테이블 조건에 일치하는 것을 찾으려고 했을 것입니다.

계속 쳐다보면 더 헷갈릴 수도 있으니원리를 찾아보시면 좋을 듯 합니다. ^^.

+ Recent posts