SQL 조인(join)

3 분 소요


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;

REFERENCE

카테고리:

업데이트:

댓글남기기