티스토리 뷰

DBMS

SQL JOIN 정리 (Inner Join & Outer Join)

딤딤이 2012. 6. 5. 22:42


지금까지 SQL의 조인을 어설프게 이해하고 사용하고 있었다 덕분에 오늘 삽질좀 했다. 그래서 관련 내용을 정리해본다. 


1. INNER JOIN
  - 두 테이블간의 조인 조건을 만족하는 ROW만 리턴함... (교집합 이라고 하기엔 좀 애매하지만 일단 그렇게 이해하는게 쉽다.)

 

2. OUTER JOIN
  - LEFT/RIGHT/FULL 형태의 OUTER JOIN 이 있음
  - LEFT OUTER JOIN의 경우 조인문 왼쪽에 있는 테이블의 모든 결과를 가져온 후 오른쪽 테이블의 데이터를 매칭하며, 매칭되는 데이터가 없는 경우 NULL 매칭
  - RIGHT OUTER JOIN은 LEFT 조인의 반대  - FULL OUTER JOIN은 일반적으로 사용할 일이 없으며, DB에 따라 지원하지 않음??? 간단히 설명하자면 두 테이블의 합집합이라고 이해하면 될 듯...


3. 주의 사항
  - 일반적으로 조인은 1:1 혹은 N:1 의 관계를 갖는 경우 유용한 것 같음... 1:N 관계에서 조인문을 사용하는 경우 기준이 되는 테이블의 데이터가 중복되는 결과를 리턴함. 따라서 1:N 관계에서 조인문을 통해 N에 해당하는 테이블의 컬럼을 이용해 제한조건을 사용하는 경우 distinct 혹은 group by 를 사용하여 1에 해당 하는 테이블의 데이터가 중복되지 않도록 해야 한다.  (에궁... 먼가 명확하지 않은 설명 ㅠ.ㅠ)
 

4. 예제 

CREATE TABLE tbl1 (id INT, name VARCHAR(8));
INSERT INTO tbl1 (id,name) VALUES (1,'aaa') ;
INSERT INTO tbl1 (id,name) VALUES (2,'bbb') ;
INSERT INTO tbl1 (id,name) VALUES (3,'ccc') ;
INSERT INTO tbl1 (id,name) VALUES (4,'ddd') ;
INSERT INTO tbl1 (id,name) VALUES (5,'eee') ;

CREATE TABLE tbl2 (id INT, car VARCHAR(8)) ;
INSERT INTO tbl2 (id,car) VALUES (2,'AVANTE') ;
INSERT INTO tbl2 (id,car) VALUES (3,'SONATA') ;
INSERT INTO tbl2 (id,car) VALUES (2, 'MINI');

-- Inner Join1
select a.id, a.name, b.car from tbl1 a inner join tbl2 b on a.id = b.id
-- Inner Join2 (위와 동일)
select a.id, a.name, b.car from tbl1 a, tbl2 b where a.id = b.id

<result>
2 bbb   AVANTE
3 ccc   SONATA

-- left outer join
select a.id, a.name, b.car from tbl1 a left outer join tbl2 b on a.id = b.id

<result>
1 aaa null
2 bbb AVANTE
3 ccc SONATA
4 ddd null
5 eee null

-- right outer join
select a.id, a.name, b.car from tbl1 a right outer join tbl2 b on a.id = b.id

<result>
2 bbb AVANTE
3 ccc SONATA

-- left outer join 을 이용해서 inner join과 동일한 결과 얻기
select a.id, a.name, b.car from tbl1 a left outer join tbl2 b on a.id = b.id where b.id is not null

<result>
2 bbb AVANTE
3 ccc SONATA


-- N:1 관계에서의 조인 예제 (Outer Join 의 경우도 비슷함)

INSERT INTO tbl2 (id,car) values (2, 'MINI');

select a.id, a.name, b.car from tbl1 a, tbl2 b where a.id = b.id

<result>
2 bbb  AVANTE
2 bbb  MINI
3 ccc  SONATA

select distinct a.id, a.name, b.car from tbl1 a, tbl2 b where a.id = b.id group by a.id

<result>
2 bbb AVANTE
3 ccc SONATA


PS. 이렇게 정리는 했지만 아직도 뭔가 명확하지 않은 느낌이다.  ㅡㅡ;;; 잘못된 부분이나 좀더 명확한 설명이 가능하신 분은 조언 부탁 드립니다.


댓글