JOIN (조인)
정의
- 여러 테이블을 연결 또는 결합하여 데이터를 출력하는 것 입니다.
- 일반적으로 PK(기본 키)나 FK(외래 키)의 연관성에 의해 성립 됩니다.
종류
- (INNER) JOIN → 교집합
- LEFR (OUTER) JOIN → 부분집합
- RIGHT (OUTER) JOIN → 부분집합
- FULL (OUTER) JOIN → 합집합
- CROSS JOIN → 모든 경우의 수
- SELF JOIN → 동일 테이블
2가지 테이블 (A, B)가 있다고 가정 후 여러 JOIN들에 대하여 학습해보겠습니다.
TABLE_A
ID | ENAME |
1 | AAAA |
2 | BBBB |
3 | CCCC |
TABLE_B
(INNER) JOIN
- 교집합으로, JOIN 조건에서 동일한 값이 있는 행만 반환
- 만약 INNER JOIN 표시가 있다면 WHERE 절에서 사용하던 JOIN 조건을 FROM 절에 사용하겠다라는 뜻을 가짐
- USING, ON 조건절을 필수적으로 사용해야 함(INNER JOIN 키워드를 사용할 경우)
- INNER 키워드 생략 가능, INNER JOIN을 통째로 생략도 가능.
ID | ENAME | KNAME |
1 | AAAA | 가 |
2 | BBBB | 나 |
SELECT
A.ID, A.ENAME, B.KNAME
FROM TABLE_A AS A INNER JOIN TABLE_B AS B
ON A.ID = B.ID
고전적인 WHERE의 INNER JOIN문
SELECT
A.ID, A.ENAME, B.KNAME
FROM TABLE_A AS A, TABLE_B AS B
WHERE A.ID = B.ID
LEFT (OUTER) JOIN
- 부분 집합으로, JOIN 조건에서 동일한 값 뿐만 아니라 동일한 값이 없더라도 왼쪽 테이블의 값을 포함하여 반환
- A,B 테이블간 조인 조건이 맞지 않는 A와B 테이블의 레코드 중 A테이블 레코드는 무조건 결과값에 포함되어 나오는 것입니다.
ID | ENAME | KNAME |
1 | AAAA | 가 |
2 | BBBB | 나 |
3 | CCCC | NULL |
SELECT A.ID, A.ENAME, B.KNAME
FROM TABLE_A AS A LEFT OUTER JOIN TABLE_B AS B
ON A.ID = B.ID
- JOIN 조건에서 동일한 값이 없는 왼쪽 테이블의 값만 포함하여 반환
- A - B
SELECT A.ID, A.ENAME, B.KNAME
FROM TABLE_A AS A LEFT OUTER JOIN TABLE_B AS B
ON A.ID = B.ID
WHERE B.ID IS NULL
RIGHT (OUTER) JOIN
- 부분 집합으로, JOIN 조건에서 동일한 값 뿐만 아니라 동일한 값이 없더라도 오른쪽 테이블의 값을 포함하여 반환
- A,B 테이블간 조인 조건이 맞지 않는 A와B 테이블의 레코드 중 B테이블 레코드는 무조건 결과값에 포함되어 나오는 것입니다.
ID | ENAME | KNAME |
1 | AAAA | 가 |
2 | BBBB | 나 |
4 | NULL | 라 |
5 | NULL | 마 |
SELECT A.ID, A.ENAME, B.KNAME
FROM TABLE_A AS A RIGHT OUTER JOIN TABLE_B AS B
ON A.ID = B.ID
- JOIN 조건에서 동일한 값이 없는 오른쪽 테이블의 값만 포함하여 반환
- B - A
ID | ENAME | KNAME |
4 | NULL | 라 |
5 | NULL | 마 |
SELECT A.ID, A.ENAME, B.KNAME
FROM TABLE_A AS A RIGHT OUTER JOIN TABLE_B AS B
ON A.ID = B.ID
WHERE A.ID IS NULL
FULL (OUTER) JOIN
- 합집합을 말한다.
- JOIN 조건시 양 쪽테이블의 모든 내용이 포함되어 반환된다.
ID | ENAME | KNAME |
1 | AAAA | 가 |
2 | BBBB | 나 |
3 | CCCC | NULL |
4 | NULL | 라 |
5 | NULL | 마 |
SELECT A.ID, A.ENAME, B.KNAME
FROM TABLE_A AS A FULL OUTER JOIN TABLE_B AS B
ON A.ID = B.ID
- FULL OUTER 가 가지고 있는 것 중 공통적인 부분을 제외한 값
ID | ENAME | KNAME |
3 | CCCC | NULL |
4 | NULL | 라 |
5 | NULL | 마 |
SELECT A.ID, A.ENAME, B.KNAME
FROM TABLE_A AS A FULL OUTER JOIN TABLE_B AS B
ON A.ID = B.ID
WHERE A.ID IS NULL OR B.ID IS NULL
CROSS JOIN
- PRODUCT 개념으로 테이블 간 JOIN조건이 없는 경우, 생길 수 있는 모든 데이터의 조합을 뜻함
ID | ENAME | ID | KNAME |
1 | AAAA | 1 | 가 |
1 | AAAA | 2 | 나 |
1 | AAAA | 4 | 라 |
1 | AAAA | 5 | 마 |
2 | BBBB | 1 | 가 |
2 | BBBB | 2 | 나 |
2 | BBBB | 4 | 라 |
2 | BBBB | 5 | 마 |
3 | CCCC | 1 | 가 |
3 | CCCC | 2 | 나 |
3 | CCCC | 4 | 라 |
3 | CCCC | 5 | 마 |
- 왼쪽 테이블의 데이터 1개당 오른쪽 테이블 데이터를 처음부터 끝까지 하나씩 결합한다.
- 그리고 왼쪽의 데이터가 없어질 때까지 반복한다.
SELECT A.ID, A.ENAME, B.ID, B.KNAME
FROM TABLE_A AS A CROSS JOIN TABLE_B AS B
SELF JOIN
- 자기자신과 자기자신을 조인하는 것이다.
- 하나의 테이블을 여러번 복사해서 조인한다고 생각하면 편하다.
- 자신이 갖고 있는 칼럼을 다양하게 변형시켜 활용할 때 자주 사용한다.
SELECT A.NAME, B.AGE
FROM EX_TABLE AS A INNER JOIN EX_TABLE AS B