Join
•
2개 이상의 테이블을 논리적으로 연결하여 가져오는 것
•
n개의 테이블을 join하는 경우에는 최소 n-1개의 조인 조건이 필요하다
•
조인 조건은 일반적으로 각 테이블의 PK(Primary Key) 및 FK(Foreign Key)로 구성된다.
Join의 종류
•
처리 방식에 따라
◦
inner join : 조인 조건에 부합하는 레코드만 포함
◦
outer join : 조인 조건에 부합되지 않는 레코드도 포함
•
조인 컬럼에 따라
◦
natural join : 조인조건 생략, 공통컬럼 기준으로 조인
◦
cross join : 조인조건 생략, 공통컬럼 X, 곱의 형태로 조인
•
Self join : 계층형 테이블에서만 사용
JOIN시 주의할 점
•
조인의 처리는 어느 테이블을 먼저 읽을지를 결정하는 것이 중요(처리할 작업량이 달라짐)
•
INNER JOIN : 어느 테이블을 먼저 읽어도 결과가 달라지지 않아 MySQL 옵티마이저가 조인의 순서를 조절해서 다양한 방법으로 최적화를 수행할 수 있다.
•
OUTER JOIN : 반드시 OUTER가 되는 테이블을 먼저 읽어야 하므로 옵티마이저가 조인 순서를 선택할 수 없다.
MySQL Optimizer
•
RBO (Rule based optimizer)
◦
무조건 정해진 규칙에 의해서 수행됨.
◦
과거에는 hw 성능이 좋지 않아 처리 방법에 대한 비용 산정으로 인한 부담이 있었지만, 요즘은 hw 성능의 향상으로 CBO를 많이 채택함
•
CBO (cost based optimizer)
◦
optimizer가 select 등 수행 문장이 주어지면 처리 방법에 대한 비용을 산정해보고 적은 비용이 들어가는 처리방법 선택
INNER JOIN
•
가장 일반적인 JOIN의 종류이며 교집합이다.
•
동등 조인(Equi-Join)이라고도 하며, N개의 테이블 조인 시 N-1개의 조인 조건이 필요함
# 형식
select col1, col2,,,, colN
from table1 INNER JOIN table2
on table1.column = table2.column;
# using을 이용한 join 조건 지정
select col1, col2,,,, colN
from table1 INNER JOIN table2
using (column); # using절에서는 table 이름이나 alias를 명시하면 error
SQL
복사
OUTER JOIN
•
LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN(MySql은 지원 X)으로 구분 됨
•
어느 한쪽 테이블에는 해당하는 데이터가 존재하는데 다른 쪽 테이블에는 데이터가 존재하지 않을 경우 그 데이터가 검색되지 않는 문제점을 해결하기 위해 사용
Left Outer Join
•
왼쪽 테이블 기준으로 Join 조건에 일치하지 않는 데이터까지 출력
Right Outer Join
•
오른쪽 테이블 기준으로 Join 조건에 일치하지 않는 데이터까지 출력
Full Outer Join
•
양쪽 테이블을 기준으로 Join 조건에 일치하지 않는 데이터까지 출력
•
MySQL은 지원하지 않음
# left outer join
select COl1, COL2, COl3
from table1 left outer join table2
on or using;
#right outer join
select COl1, COL2, COl3
from table1 right outer join table2
on or using;
SQL
복사
SELF JOIN
•
같은 테이블끼리 join하는 경우
•
예시 : 모든 사원의 사번, 이름, 매니저사번, 매니저이름
select e.employee_id, e.first_name, m.employee_id, m.first_name
from employees e inner join employees m
on e.manager_id = m.employee_id;
SQL
복사
None-Equi JOIN
•
table의 PK, FK가 아닌 일반 column을 join 조건으로 지정
•
예시 : 모든 사원의 사번, 이름, 급여, 급여등급
select e.employee_id, e.first_name, e.salary, s.grade
from employees e join salgrades s
where e.salary between s.losal and s.hisal;
SQL
복사