조인 (JOIN)은 2개 이상의 테이블을 묶어서 하나의 결과물을 만들 때 사용하는 것이다.
조회를 할 때 각각의 테이블은 공유하고 있는 동일한 컬럼이 있어야 하며, 그 컬럼을 사용해 JOIN된 테이블의 데이터를 검색할 수 있다. 이때 사용된 컬럼은 PK키나 FK키로 사용된다.
2. 조인의 종류
1) Inner Join , 내부조인
내부 조인은 두 테이블 간에 교집합을 나타낸다
가장 흔하게 쓰이는 조인 방식이다.
조인을 사용하는 방식에는 명시적 조인 표현과 암시적 조인 표현이 있다.
-- 1.명시적 조인 표현 --
select * from table a
inner join table b
on a.key = b.key
-- 2. 암시적 조인 표현 --
select *
from table a, table b
where a.key = b.key
2) Left Outer Join , 왼쪽 조인
조인 기준 왼쪽에 있는 데이터 전체 조회한다.
외부조인중 하나로 오른쪽 테이블에 조인할 데이터가 없는경우 사용한다.
왼쪽에 있는 모든 데이터를 조회하는데 왼쪽 테이블에 데이터가 없다면 NULL 값이 넣어진다.
-- 1.명시적 조인 표현 --
select * from table a
left outer join table b
on a.key = b.key
-- 2. 암시적 조인 표현 --
select *
from table a, table b
where a.key = b.key(+)
3) Right Outer Join, 오른쪽 조인
조인 기준 오른쪽에 있는 데이터 전체 조회한다.
-- 1. 명시적 조인 표현 --
select * from table a
right outer join table b
on a.key = b.key
-- 2. 암시적 조인 표현 --
select *
from table a, table b
where a.key(+) = b.key
4) Full Outer Join, 합집합 조인
오른쪽, 왼쪽에 있는 데이터 전체 조회
두 테이블에 있는 모든 데어터가 필요할 때 사용한다.
오라클에는 OUTER JOIN 연산이 있지만 MySQL은 없기 때문에 LEFT/RIGHT OUTER JOIN을 함께 사용해 FULL OUTER JOIN 을 사용한다.
select * from table a
full outer join table b
on a.key = b.key
3. 조인의 원리
1) 중첩 루프 조인 (NESTED LOOP JOIN)
NL조인
2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 행을 결합하여 원하는 결과를 조합하는 조인 방식
인덱스에 의한 랜덤 엑세스에 기반하기 때문에 비용이 많이 증가한다 -> 대용량 테이블에 부적절하다.
driving 테이블로는 데이터가 적거나 where절 조건으로 row의 숫자를 줄일 수 있는 테이블이어야함.
driven테이블에는 조인을 위한 적절한 인덱스가 있어야 함
선행 테이블 결과를 통해 후행 테이블을 엑세스 할때 랜덤 I/O가 발생함
NL조인 동작 방식 테이블 A를 driving 테이블로 선정하고 이 테이블로부터 where절에 정의된 검색 조건을 만족하는 데이터를 걸러낸다. 이 값을 가지고 조인 대상 테이블을 반복적으로 검색하면서 조인 조건을 만족하는 최종 결과 값을 얻어낸다.
for(i=0; i<dept.length; i++){ // driving table : 조인을 할때 먼저 액세스 되는 테이블
for(j=0; j<emp.length; j++){ // driven table : 나중에 액세스 되는 테이블
}
}
중첩 for문과 같은 원리로 조건에 맞는 조인을 하는 방식이다. 위의 사진을 예로 들면 먼저 dept_loc인덱스를 사용해 dept테이블에 있는 데이터 gb=2를 추출한다. 추출된 값을 사용해서 emp_deptno 인덱스에서 같은 deptno를 가지는 사원들의 정보를 sal>=1500 이라는 조건을 통해 emp테이블을 조회한다.
2) 정렬 병합 조인 (SORT MERGE JOIN)
조회의 범위가 넓을 때 주로 사용하는 조인 방식
각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 후 조인작업을 수행하는 조인
조인할 때 적절한 인덱스가 없는 경우
대용량의 테이블을 조인하는 것이 유리한 경우
조인 조건으로 부등호와 같이 범위 비교 연산자가 사용된 경우
인덱스 사용에 랜덤 엑세스의 오버헤드가 많은 경우
정렬 병합 조인 동작 방식 각 테이블에 대해 동시에 독립적으로 데이터 먼저 읽고 읽혀진 각 테이블의 데이터를 조인을 위한 연결고리에 대해 정렬을 수행한다. 정렬이 끝난 후 조인을 수행한다. 즉 A테이블의 데이터를 중 조건을 만족하는 행을 찾고 정렬하는 과정을 반복한다. B 테이블도 A테이블과 동일한 과정이 반복된다. 두 테이블 사이 연결된 컬럼을 기준으로 정렬을 수행하고 조인을 하는 방식으로 동작한다.
3) 해시 조인
해시 테이블을 기반으로 하는 조인방법
조인될 두 테이블중 하나를 해시 테이블로 선정해 조인될 테이블의 조인 키 값을 해시 알고리즘으로 비교해 매치되는 결과값을 얻는 방식
비용기반 옵티마이저를 사용할 때만 사용가능하다
동등 비교를 통한 조인에서만 사용된다
많은 양의 데이터를 조인해야할 때 사용된다.
해시 조인 동작 방식
1. 빌드단계 입력 테이블 중 하나 중에서 작은 집합을 읽어 Hash area에 해시 테이블을 생성한다. *바이트가 더 작은 테이블 기반 -> 해시 함수에서 리턴 받은 버킷 주소로 찾아가 해시 체인에 앤트리를 연결한다,
2. 프로브 단계 반대쪽 큰 집합을 읽어 해시테이블을 탐색하면서 조인한다. 해시 함수에서 리턴받은 버킷 주소로 찾아가 해시 체인을 스캔하면서 데이터를 찾는다. -> 각 테이블은 한번씩만 읽게 되기 때문에 NL조인보다 성능이 좋다.