지금까지 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
출처: https://dimdim.tistory.com/entry/SQL-JOIN-정리-Inner-Join-Outer-Join [딤딤이의 블로그]
'JAVA HTML JAVASCRIPT > DB' 카테고리의 다른 글
[오라클] 데이터 중복제거 방법 (distinct, group by, 성능) (0) | 2020.07.30 |
---|---|
PostgreSQL 설치 DB생성 (0) | 2020.02.05 |
PostgreSQL 설치 및 확인 (0) | 2020.02.05 |
DBeaver 설치 및 연동 (0) | 2020.02.05 |
inner / outer join (2) (0) | 2020.01.27 |