SQL 조인(join)
0. 들어가면서
SQL 조인(join)과 관련된 내용을 정리했다. 쿼리를 수행한 결과들을 살펴보면서 어떤 차이점이 있는지 살펴본다. 예시를 위해 다음과 같은 간단한 테이블과 데이터를 사용한다. TABLE_A
에 아래와 같은 데이터가 저장되어 있다.
A | AA |
---|---|
1 | 7 |
2 | 8 |
3 | 9 |
4 | NULL |
5 | NULL |
TABLE_B
에 아래와 같은 데이터가 저장되어 있다.
A | AB |
---|---|
3 | 10 |
4 | 11 |
5 | NULL |
6 | 12 |
7 | 13 |
1. Inner Join
이너 조인(inner join)
은 특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우에 해당하는 데이터를 가져온다. 벤 다이어그램(venn diagram) 이미지로 표현하면 교집합 형태가 된다. 다음과 같이 쿼리를 작성한다.
SELECT <select_list>
FROM TABLE_A tableA
INNER JOIN TABLE_B tableB ON tableA.A = tableB.A
쿼리 실행 결과는 다음과 같다.
A | AA | A | AB |
---|---|---|---|
3 | 9 | 3 | 10 |
4 | NULL | 4 | 11 |
5 | NULL | 5 | NULL |
벤다이어그램으로 표시하면 다음과 같다.

2. Left Join
레프트 조인(left join)
은 특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우와 왼쪽 테이블에만 데이터가 존재하는 경우에 해당하는 데이터를 가져온다. 벤 다이어그램 이미지로 표현하면 왼쪽 테이블의 데이터 집합을 의미한다. 다음과 같이 쿼리를 작성한다.
SELECT <select_list>
FROM TABLE_A tableA
LEFT JOIN TABLE_B tableB ON tableA.A = tableB.A
쿼리 실행 결과는 다음과 같다.
A | AA | A | AB |
---|---|---|---|
1 | 7 | NULL | NULL |
2 | 8 | NULL | NULL |
3 | 9 | 3 | 10 |
4 | NULL | 4 | 11 |
5 | NULL | 5 | NULL |
벤다이어그램으로 표시하면 다음과 같다.

3. Right Join
라이트 조인(right join)
은 특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우와 오른쪽 테이블에만 데이터가 존재하는 경우에 해당하는 데이터를 가져온다. 벤 다이어그램 이미지로 표현하면 오른쪽 테이블의 데이터 집합을 의미한다. 다음과 같이 쿼리를 작성한다.
SELECT <select_list>
FROM TABLE_A tableA
RIGHT JOIN TABLE_B tableB ON tableA.A = tableB.A
쿼리 실행 결과는 다음과 같다.
A | AA | A | AB |
---|---|---|---|
3 | 9 | 3 | 10 |
4 | NULL | 4 | 11 |
5 | NULL | 5 | NULL |
NULL | NULL | 6 | 12 |
NULL | NULL | 7 | 13 |
벤다이어그램으로 표시하면 다음과 같다.

4. Outer Join
풀 아우터 조인(full outer join)
혹은 풀 조인(full join)
이라고 한다. 테이블의 모든 레코드(record)들을 가져온 후 특정 컬럼을 기준으로 동일 데이터를 가지는 경우에만 연결해주고 나머지는 NULL
로 지정한다. 벤 다이어그램 이미지로 표현하면 두 테이블의 전체 데이터 집합을 의미한다. 다음과 같이 쿼리를 작성한다.
SELECT <select_list>
FROM TABLE_A tableA
FULL OUTER JOIN TABLE_B tableB ON tableA.A = tableB.A
쿼리 실행 결과는 다음과 같다.
A | AA | A | AB |
---|---|---|---|
1 | 7 | NULL | NULL |
2 | 8 | NULL | NULL |
3 | 9 | 3 | 10 |
4 | NULL | 4 | 11 |
5 | NULL | 5 | NULL |
NULL | NULL | 6 | 12 |
NULL | NULL | 7 | 13 |
벤다이어그램으로 표시하면 다음과 같다.

5. Left Excluding Join
레프트 익스클루딩 조인(left excluding join)
은 레프트 조인 방식에서 교집합 영역을 제거한 데이터 영역이다. 조인 시 기준으로 사용한 컬럼 값이 오른쪽 테이블에서 NULL
인 경우를 찾아낸다. 벤 다이어그램 이미지로 표현하면 왼쪽 테이블에만 존재하는 데이터 집합을 의미한다. 다음과 같이 쿼리를 작성한다.
SELECT <select_list>
FROM TABLE_A tableA
LEFT JOIN TABLE_B tableB ON tableA.A = tableB.A
WHERE tableB.A IS NULL
쿼리 실행 결과는 다음과 같다.
A | AA | A | AB |
---|---|---|---|
1 | 7 | NULL | NULL |
2 | 8 | NULL | NULL |
벤다이어그램으로 표시하면 다음과 같다.

6. Right Excluding Join
라이트 익스클루딩 조인(right excluding join)
은 라이트 조인 방식에서 교집합 영역을 제거한 데이터 영역이다. 조인 시 기준으로 사용한 컬럼 값이 왼쪽 테이블에서 NULL
인 경우를 찾아낸다. 벤 다이어그램 이미지로 표현하면 오른쪽 테이블에만 존재하는 데이터 집합을 의미한다. 다음과 같이 쿼리를 작성한다.
SELECT <select_list>
FROM TABLE_A tableA
RIGHT JOIN TABLE_B tableB ON tableA.A = tableB.A
WHERE tableA.A IS NULL
쿼리 실행 결과는 다음과 같다.
A | AA | A | AB |
---|---|---|---|
NULL | NULL | 6 | 12 |
NULL | NULL | 7 | 13 |
벤다이어그램으로 표시하면 다음과 같다.

7. Outer Excluding Join
아우터 익스클루딩 조인(outer excluding join)
은 아우터 조인 방식에서 교집합 영역을 제거한 데이터 영역이다. 아우터 조인 방식에서 조인 시 기준으로 사용한 컬럼 값이 왼쪽 테이블에서 NULL
인 경우 혹은 오른쪽 테이블에서 NULL
인 경우를 찾아낸다. 벤 다이어그램 이미지로 표현하면 두 테이블의 데이터에서 교집합 영역을 제거한 데이터 집합을 의미한다. 다음과 같이 쿼리를 작성한다.
SELECT <select_list>
FROM TABLE_A tableA
FULL OUTER JOIN TABLE_B tableB ON tableA.A = tableB.A
WHERE tableA.A IS NULL OR tableB.A IS NULL
쿼리 실행 결과는 다음과 같다.
A | AA | A | AB |
---|---|---|---|
1 | 7 | NULL | NULL |
2 | 8 | NULL | NULL |
NULL | NULL | 6 | 12 |
NULL | NULL | 7 | 13 |
벤다이어그램으로 표시하면 다음과 같다.

CLOSING
MySQ의 경우 아우터 조인
키워드를 처리하지 못 한다. UNION
키워드를 사용하여 같은 결과를 얻을 수 있다. 다음과 같이 쿼리를 작성한다.
SELECT *
FROM mysqldb.TABLE_A tableA
LEFT JOIN mysqldb.TABLE_B tableB ON tableA.A = tableB.A
UNION
SELECT *
FROM mysqldb.TABLE_A tableA
RIGHT JOIN mysqldb.TABLE_B tableB ON tableA.A = tableB.A;
아우터 익스클루딩 조인은 다음과 같이 쿼리를 작성한다.
SELECT *
FROM mysqldb.TABLE_A tableA
LEFT JOIN mysqldb.TABLE_B tableB ON tableA.A = tableB.A
WHERE tableB.A IS NULL
UNION
SELECT *
FROM mysqldb.TABLE_A tableA
RIGHT JOIN mysqldb.TABLE_B tableB ON tableA.A = tableB.A
WHERE tableA.A IS NULL;
댓글남기기