본문 바로가기
Computer Science/SQL

[SQL] JOIN 개념과 종류, JOIN 컬럼에 NULL이 있을 때 실습 예제

by sohyunwriter 2021. 1. 17.

[SQL] JOIN 개념과 종류

JOIN : 서로 다른 테이블에서 가져온 레코드들을 공통된 필드를 기준으로 합쳐준다.

SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름1
옵션 JOIN 테이블이름2 ON 테이블이름1.필드이름 = 테이블이름2.필드이름

 

1) INNER JOIN(내부 조인) : 두 테이블 모두에 기준 필드의 값이 있는 레코드만 가져온다.

 

2) LEFT JOIN : 조인문의 왼쪽 테이블의 모든 결과를 가져 온 후 오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL로 표시한다.

 

 

 

SELECT 검색할 컬럼
FROM 테이블명 LEFT JOIN 테이블명2 ON 테이블.컬럼명 = 테이블2.컬럼명;

 

3) RIGHT JOIN : 조인문의 오른쪽 테이블의 모든 결과를 가져온 후 왼쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL을 표시한다.

 

4) FULL OUTER JOIN : 기준 필드의 값과 매치되는 레코드가 어느 한쪽 테이블에라도 있으면 해당 레코드를 해당 테이블에서 가져온다. 결과 테이블이 매우 커질 수 있으므로 주의해야 한다.

**MySQL에는 FULL OUTER JOIN이 없으므로, LEFT JOIN과 RIGHT JOIN을 UNION하는 식으로 하여 FULL OUTER JOIN을 만든다.

 

 

위 4가지 개념을 좀 더 어렵게 실습해보자. (링크)

 

만약 아래와 같은 테이블 2개가 있다(각 테이블의 primary key는 'id'임)고 했을 때, 

이 두 테이블을 rev 기준으로 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN 하게 되면 어떻게 될까?

table1
table2

 

INNER JOIN

INNER JOIN을 하면 다음과 같이 

두 테이블에 모두 존재하는 rev 값만 가져오며, 

rev값인 NULL이었던 레코드는 가져오지 않는다.

 

-- INNER JOIN
SELECT * 
FROM docs INNER JOIN docs2 ON docs.rev = docs2.rev;

INNER JOIN

LEFT JOIN

LEFT JOIN을 하면 다음과 같이 

LEFT TABLE에 있는 모든 레코드를 가져오고

RIGHT TABLE과 매칭되는 rev 값이 있으면 해당 레코드를 가져오고 

해당 rev 값이 null이거나, 해당 rev 값이 없으면 NULL을 출력한다.

 

-- LEFT JOIN
SELECT * 
FROM docs LEFT JOIN docs2 ON docs.rev = docs2.rev;

LEFT JOIN

RIGHT TABLE

RIGHT JOIN 역시 LEFT JOIN과 개념은 같다.

 

-- RIGHT JOIN
SELECT * 
FROM docs RIGHT JOIN docs2 ON docs.rev = docs2.rev;

RIGHT JOIN

FULL OUTER JOIN

FULL OUTER JOIN을 하게 되면 

LEFT JOIN에 해당하는 모든 레코드를 가져오고 

RIGHT JOIN에 해당하는 모든 레코드를 가져온 후 

LEFT JOIN과 RIGHT JOIN 모두에 존재하는 레코드는 하나만 출력한다.

또, 한쪽에 해당 필드 값이 없거나 기준이 되는 필드 값이 NULL인 경우, 가져온 빈 컬럼들에는 NULL을 출력한다.

 

-- FULL OUTER JOIN
SELECT * 
FROM docs LEFT JOIN docs2 ON docs.rev = docs2.rev
UNION
SELECT * 
FROM docs RIGHT JOIN docs2 ON docs.rev = docs2.rev;

FULL OUTER JOIN

 

 

(참고)

SQL의 keyword는 아니지만 많이 쓰이는 개념이 있다. 바로 동일 테이블 사이의 조인을 해야할 경우는 다음과 같다. Self Join이 어떤 sql 키워드는 아니기 때문에 위에는 추가하지 않았다.

 

SELF JOIN : 동일 테이블 사이의 조인. FROM 절에 동일 테이블이 두 번 이상 나타난다. 동일 테이블 사이의 조인을 수행하면 테이블과 컬럼이 모두 동일하기 때문에 식별을 위해 반드시 테이블 별칭(Alias)를 사용해야 한다.

SELECT ALIAS명1.컬럼명
     , ALIAS명2.컬럼명
  FROM 테이블1 ALIAS명1, 테이블2 ALIAS명2
 WEHRE ALIAS명1.컬럼명2 = ALIAS명2.컬럼명1;  

 


-관련 질문

 

Q. INNER JOIN과 LEFT JOIN의 차이는?

 

A. 

INNER JOIN은 두 테이블 모두에 기준 필드의 값이 존재하는 레코드만 가져오고, 

LEFT JOIN은 왼쪽 테이블에 있는 모든 레코드를 가져오고,

기준 필드의 값가 매치되는 레코드들을 오른쪽 테이블에서 가져옵니다.

만약 왼쪽 테이블의 필드의 기준 필드 값과 매치되는 값이 오른쪽 테이블에 없으면 NULL 값을 가져옵니다.

 

 

Q. INNER JOIN과 OUTER JOIN의 차이는?

 

A. 

INNER JOIN은 두 테이블에 기준 필드의 값이 모두 존재하는 레코드만 가져오고, 

OUTER JOIN은 기준 필드의 값이 어느 한쪽에만 존재해도 해당 레코드를 가져옵니다.

 

 

Q. INNER JOIN / LEFT JOIN / OUTER JOIN 에서 JOIN 기준이 되는 컬럼에 NULL이 있다면?

 

A. 

INNER JOIN - 기준 필드 값이 NULL인 경우는 가져오지 않는다.

LEFT JOIN - 기준 필드 값이 NULL인 경우도 가져온다.

OUTER JOIN - 기준 필드 값이 NULL인 경우도 가져온다.

 

 

Q. 다음 중 SELF JOIN을 수행해야 하는 경우는 어떤 경우인가?  <SQLP 책>

(a) 두 테이블에 공통 칼럼이 존재하고 두 테이블이 연관 관계가 있다.

(b) 두 테이블에 연관된 칼럼은 없으나 조인해야 한다.

(c) 한 테이블 내에서 두 칼럼이 연관 관계가 있다.

(d) 한 테이블 내에서 연관된 칼럼은 없으나 조인해야 한다.

 

A. (c) 한 테이블 내에서 두 칼럼이 연관 관계가 있다.

 

 

 

 

-참고문헌

더보기

'Computer Science > SQL' 카테고리의 다른 글

집합 연산자 개념과 종류  (0) 2021.01.20