INNER JOIN, OUTER JOIN(LEFT, RIGHT, FULL)
여러 테이블을 합칠 때 사용한다.
INNER JOIN은 값이 같은 컬럼만 합치고
OUTER JOIN은 LEFT, RIGHT 기준으로 한 쪽에 맞춰서 합친다.
CREATE TABLE TB1 ( NAME VARCHAR2(20), AGE NUMBER(3) );
CREATE TABLE TB2 ( NAME VARCHAR2(20), AGE NUMBER(3) );
INSERT INTO TB1(NAME, AGE) VALUES('김철수', 30);
INSERT INTO TB1(NAME, AGE) VALUES('이영희', 31);
INSERT INTO TB1(NAME, AGE) VALUES('박영수', 32);
INSERT INTO TB1(NAME, AGE) VALUES('엄영수', 33);
INSERT INTO TB2(NAME, AGE) VALUES('김철수', 34);
INSERT INTO TB2(NAME, AGE) VALUES('최수영', 35);
INSERT INTO TB2(NAME, AGE) VALUES('하희영', 36);
여기 NAME과 AGE 형태의 값을 받는 테이블 TB1, TB2가 있는데
TB1에는 4줄의 값을,
TB2에는 3줄의 값을 삽입했다.
이 두 테이블의 이용해 INNER JOIN과 OUTER JOIN의 예제 및 차이점을 알아보자.
1. INNER JOIN
-- INNER JOIN: 조건에 해당하는 값만 나옴
SELECT * FROM TB1 INNER JOIN TB2 ON TB1.NAME = TB2.NAME;
select * from 테이블1 inner join 테이블2 on 테이블1.컬럼 = 테이블2.컬럼
on 뒤에 조건이 맞는 내용만 가져온다.
TB1의 NAME과 TB2의 NAME이 같은 경우는 김철수 밖에 없으니 김철수만 나온다.
2. LEFT, RIGHT OUTER JOIN
-- LEFT OUTER JOIN : 왼쪽 테이블에 값이 있을 시 오른쪽 테이블이 조건에 맞지 않아도 나옴
SELECT * FROM TB1 LEFT OUTER JOIN TB2 ON TB1.NAME = TB2.NAME
-- RIGHT OUTER JOIN : 오른쪽 테이블에 값이 있을 시 왼쪽 테이블이 조건에 맞지 않아도 나옴
SELECT * FROM TB1 RIGHT OUTER JOIN TB2 ON TB1.NAME = TB2.NAME
OUTER JOIN은 한 쪽 테이블에 값이 있을 경우에 다른 쪽 테이블이 조건에 맞지 않아도 가져오게 되는데
LEFT는 왼쪽, RIGHT는 오른 쪽 테이블에 값이 있을 경우 반대 테이블이 조건에 맞지 않아도 가져온다는 의미다.
보면 LEFT, RIGHT 테이블 모두 조건에 맞는 값은 김철수 밖에 없으나
LEFT, RIGHT 테이블에 값이 있기 때문에 LEFT, RIGHT는 채우고
반대쪽 테이블은 비워서 가져온다.
3. FULL OUTER JOIN
-- FULL OUTER JOIN: 한 쪽 테이블에 값이 있을 시 다른 쪽 테이블이 조건에 맞지 않아도 나옴
SELECT * FROM TB1 FULL OUTER FOIN TB2 ON TB1.NAME = TB2.NAME
FULL OUTER JOIN은 어느 한 쪽 테이블에 값이 있을 경우 다른 테이블과 조건이 맞지 않아도 가져온다.
정리
1. INNER JOIN : 두 테이블 간 조건이 맞는 값만 가져온다.
2. LEFT, RIGHT OUTER JOIN : 조건에 맞지 않아도 LEFT 혹은 RIGHT 값이 존재하면 값을 가져온다.
3. FULL OUTER JOIN : 두 테이블 중 한 테이블에만 값이 있다면 조건에 맞지 않아도 값을 가져온다.
CREATE TABLE TB1 ( NAME VARCHAR2(20), AGE NUMBER(3) );
CREATE TABLE TB2 ( NAME VARCHAR2(20), AGE NUMBER(3) );
INSERT INTO TB1(NAME, AGE) VALUES('김철수', 30);
INSERT INTO TB1(NAME, AGE) VALUES('이영희', 35);
INSERT INTO TB1(NAME, AGE) VALUES('박영수', 40);
INSERT INTO TB1(NAME, AGE) VALUES('엄영수', 40);
INSERT INTO TB2(NAME, AGE) VALUES('김철수', 30);
INSERT INTO TB2(NAME, AGE) VALUES('최수영', 50);
INSERT INTO TB2(NAME, AGE) VALUES('하희영', 55);
-- INNER JOIN : 조건에 해당하는 값만 나옴
SELECT * FROM TB1 INNER JOIN TB2 ON TB1.NAME = TB2.NAME;
-- LEFT OUTER JOIN : 왼쪽 테이블에 값이 있을 시 오른쪽 테이블이 조건에 맞지 않아도 나옴
SELECT * FROM TB1 LEFT OUTER JOIN TB2 ON TB1.NAME = TB2.NAME
-- RIGHT OUTER JOIN : 오른쪽 테이블에 값이 있을 시 왼쪽 테이블이 조건에 맞지 않아도 나옴
SELECT * FROM TB1 RIGHT OUTER JOIN TB2 ON TB1.NAME = TB2.NAME
-- FULL OUTER JOIN : 한쪽 테이블에 값이 있을 시 다른 쪽 테이블이 조건에 맞지 않아도 나옴
SELECT * FROM TB1 FULL OUTER JOIN TB2 ON TB1.NAME = TB2.NAME