JOIN함수도 여러개의 SELECT문의 결과를 하나의 결과 세트로 연결한다. 즉, JOIN은 원하는 데이터를 추출하기 위해 두개의 테이블을 결합하는 것이다.
JOIN을 하기 위해서는 가장 먼저 공통의 칼럼을 찾아야 한다. 공통의 칼럼이란, 두 테이블에서 공통으로 존재하는 컬럼이다.
공통의 칼럼뿐 아니라 어떤 테이블이 기준이 되고, 어떤 칼럼이 종속이 되는지를 잘 파악해야 한다. 테이블의 구조는 아래와 같이 다양하게 표현된다.
여기서, N:N 구조를 사용했을 때, 기준테이블이 없기 때문에 데이터가 부풀려져 리턴될 수 있다. 즉, 데이터의 크기에 비해 의미있는 데이터가 적어질 수 있다. 또한 데이터 검증을 할 수 없기에, 조인함수에서는 N:N 구조는 사용하지 않는 것을 권장한다.
또한 데이터에는 PK,FK가 존재한다.
PK 는 기본키이기 때문에 NULL 일 수 없고, 유일한 값을 가진다. 따라서 PK 컬럼은 모든 데이터를 식별하는 기준이 되는 컬럼으로 보면 된다.
테이블 당 하나의 PK만 가진다.
FK 는 외래키이다. 다른 테이블의 PK 와 연결되어 테이블 간 관계를 나타내주는 역할을하는 칼럼을 의미한다.
JOIN함수는 다양한 방식이 있기 때문에 최종적으로 구하고자 하는 데이터와 알맞은 방식을 선택해야 한다.
| JOIN 종류 | 특징 |
|---|---|
| INNER JOIN | 두 테이블에서 일치하는 값을 가진 행을 출력(교집합) |
| LEFT JOIN | 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환한다. 일치하는 항목이 없으면 오른쪽 테이블의 열에 대해 NULL 값이 출력됩니다. |
| RIGHT JOIN | 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환합니다. 일치하는 항목이 없으면 왼쪽 테이블의 열에 대해 NULL 값이 출력됩니다. |
| FULL OUTER JOIN | 모든 데이터를 보고 싶을 때 사용합니다. 용량 이슈로 자주 사용하지 않아요! MySQL 환경에서는 제공하지 않아 LEFT JOIN 과 RIGHT 조인의 UNION으로 계산해야합니다. (합집합) |
# INNER JOIN 작성법(기초편)
select 컬럼1, 컬럼2...
from 테이블1 as a
inner join 테이블2 as b
on a.공통컬럼=b.공통컬럼
# INNER JOIN 작성법 (서브쿼리 활용편)
select 테이블명1.컬럼a, ....
from( select 컬럼a, 컬럼b ...
from 테이블1
)as 테이블명1 #첫번째 셀렉트 절의 결과를 '테이블명1' 로 명시
inner join #(또는 join) #테이블1과 테이블2를 inner join 하겠다는 의미
( select 컬럼c, 컬럼d...
from 테이블2
)as 테이블명2 #두번째 셀렉트 절의 결과를 '테이블명2' 로 명시
on a.공통컬럼=b.공통컬럼# 공통된 의미의 컬럼으로, 컬럼이름이 같을필요는 없음
# 공통컬럼은 ON 절의 조건절이 되며, 조건절은 1개가 아닐 수 있음
# 즉, on a.공통컬럼=b.공통컬럼 and a.공통컬럼2=b.공통컬럼2 가 될 수 있음
# LEFT JOIN 작성법(기초편)
select 컬럼1, 컬럼2...
from 테이블1 as 테이블명1
left join 테이블2 as 테이블명2
on a.공통컬럼=b.공통컬럼
# LEFT JOIN 작성법 (서브쿼리 활용편)
select 테이블명1.컬럼a, ....
from( select 컬럼a, 컬럼b ...
from 테이블1
)as 테이블명1 #첫번째 셀렉트 절의 결과를 '테이블명1' 로 명시
LEFT join #테이블1과 테이블2를 LEFT join 하겠다는 의미
( select 컬럼c, 컬럼d...
from 테이블2
)as 테이블명2 #두번째 셀렉트 절의 결과를 '테이블명2' 로 명시
on a.공통컬럼=b.공통컬럼# 공통된 의미의 컬럼으로, 컬럼이름이 같을필요는 없음
# RIGHT JOIN 작성법(기초편)
select 컬럼1, 컬럼2...
from 테이블1 as 테이블명1
RIGHT JOIN 테이블2 as 테이블명2
on a.공통컬럼=b.공통컬럼
# RIGHT JOIN 작성법 (서브쿼리 활용편)
select 테이블명1.컬럼a, ....
from( select 컬럼a, 컬럼b ...
from 테이블1
)as 테이블명1 #첫번째 셀렉트 절의 결과를 '테이블명1' 로 명시
RIGHT JOIN #테이블1과 테이블2를 RIGHT JOIN 하겠다는 의미
( select 컬럼c, 컬럼d...
from 테이블2
)as 테이블명2 #두번째 셀렉트 절의 결과를 '테이블명2' 로 명시
on a.공통컬럼=b.공통컬럼# 공통된 의미의 컬럼으로, 컬럼이름이 같을필요는 없음