SQL) JOIN (INNER/LEFT/RIGHT/OUTER)
본문 바로가기
Data Base/SQL

SQL) JOIN (INNER/LEFT/RIGHT/OUTER)

by 조훈이 2021. 8. 29.

JOIN (INNER / LEFT / RIGHT / OUTER)


  설명 

  둘 이상의 테이블을 연결하여 데이터를 확인할 수 있는 방법이다. 연결하고자 하는 테이블 간 공통적인 컬럼이 있어야 하며, 그 컬럼은 그 테이블의 PK 혹인 FK 로 사용되고 있어야 한다.

 

[JOIN 설명을 위한 두 테이블 정의]

CREATE TABLE S1 (
	ID INT PRIMARY KEY,
	NAME VARCHAR(30) NOT NULL
);

INSERT INTO S1 VALUES
(111, 'AAA'),
(222, 'BBB'),
(333, 'CCC'),
(444, 'DDD');

CREATE TABLE S2 (
	ID INT PRIMARY KEY,
	NAME VARCHAR(30) NOT NULL
);

INSERT INTO S2 VALUES
(111, 'AAA'),
(222, 'BBB'),
(555, 'EEE'),
(666, 'FFF');

생성이 된 두 테이블 및 데이터

 

  위와 같이 테이블과 데이터가 생성이 되었을 때를 예시로 설명하였다.

 

  INNER JOIN (S1 ∩ S2) 

  두 테이블 모두 값이 존재하는 영역에 대해서만 값을 SELECT 한다. 또한 JOIN 의 DEFAULT JOIN 이다.

SELECT * FROM S1
JOIN S2 ON S1.ID = S2.ID;

 

[실행결과]

 

  LEFT JOIN (S1) 

  좌측 테이블(S1) 에 해당되는 모든 ID값을 기준으로 SELECT 한 것을 보여준다. S1 테이블에 존재하는 ID 이지만 S2 테이블에는 존재하지 않는 ID 라면, S2 테이블에 해당되는 값들은 모두 NULL값으로 보여진다.

SELECT * FROM S1
LEFT JOIN S2 ON S1.ID = S2.ID;

[실행결과]

 

  LEFT JOIN (S1 - S2) 

  좌측 테이블(S1) 에 해당되는 모든 ID값을 기준으로 S2.ID 의 값은 NULL 인 부분만 SELECT 하여 보여준다. 

SELECT * FROM S1
LEFT JOIN S2 ON S1.ID = S2.ID
WHERE S2.ID IS NULL;

[실행결과]

 

  RIGHT JOIN (S2) 

  우측 테이블(S2) 에 해당되는 모든 ID값을 기준으로 SELECT 한 것을 보여준다. S2 테이블에 존재하는 ID 이지만 S1 테이블에는 존재하지 않는 ID 라면, S1 테이블에 해당되는 값들은 모두 NULL값으로 보여진다.

SELECT * FROM S1
RIGHT JOIN S2 ON S1.ID = S2.ID;

[실행결과]

 

  RIGHT JOIN (S2 - S1) 

  우측 테이블(S2) 에 해당되는 모든 ID값을 기준으로 S1.ID 의 값은 NULL 인 부분만 SELECT 하여 보여준다.

SELECT * FROM S1
RIGHT JOIN S2 ON S1.ID = S2.ID
WHERE S1.ID IS NULL;

[실행결과]

 

  OUTER JOIN (S1 ∪ S2)

  좌측 테이블과 우측 테이블 ID값에 해당되는 모든 부분들을 SELECT 하여 보여준다. 오라클에서는 OUTER JOIN 이 사용 가능하지만 MySQL 에서는 지원을 하지 않기때문에 LEFT JOIN 과 RIGHT JOIN 을 UNION 하는 방식으로 구현할 수 있다. 

SELECT * FROM S1
LEFT JOIN S2 ON S1.ID = S2.ID
UNION
SELECT * FROM S1
RIGHT JOIN S2 ON S1.ID = S2.ID;

[실행결과]

 

  OUTER JOIN (S1 ∪ S2 - S1 ∩ S2) 

  좌측 테이블과 우측 테이블 ID값에 해당되는 모든 부분들 중 공통되는 부분을 제외한 부분을 SELECT 하여 보여준다. 오라클에서는 OUTER JOIN 이 사용 가능하지만 MySQL 에서는 지원을 하지 않기때문에 LEFT JOIN 과 RIGHT JOIN 을 UNION 하는 방식으로 구현할 수 있다.

SELECT * FROM S1
LEFT JOIN S2 ON S1.ID = S2.ID
WHERE S1.ID IS NULL OR S2.ID IS NULL
UNION
SELECT * FROM S1
RIGHT JOIN S2 ON S1.ID = S2.ID
WHERE S1.ID IS NULL OR S2.ID IS NULL;

[실행결과]

 

728x90

댓글