둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인
일반적으로 조인 조건을 포함하는 WHERE절을 작성
조인조건은 일반적으로 각 테이블의 PK 및 FK 로 구성
Inner Join
Outer Join
Left Outer Join
Right Outer Join
equi-join : 동등 비교 조건 (=)
non equi-join : 동등 비교가 아닌 조건 (≥, ≤, >, <)
inner-join : 조인조건에 부합하는 레코드를 가져올 때, 부합하는 레코드만 결과 집합으로 가져옴
outer-join : 조인조건에 부합하는 레코드 뿐만 아니라 부합하지 않는 레코드도 포함하여 결과 집합으로 가져옴 ⇒ 기준 테이블을 정하고 그 테이블의 전체 데이터를 가져옴 left or right
self join : 자신과 자신을 조인하는 형태 ( 사원 : 사원-상사 ), ( 게시판 : 자식글 -부모글)
cross join : 두 테이블의 모든 가능한 조인을 다 처리한 형태의 결과 (조인조건을 명시하지 않았을 때)
natural join : 조인조건을 명시하지 않고 두 테이블의 모든 공통컬럼을 이용하여 조인
조인의 처리는 어느 테이블을 먼저 읽을지를 결정하는 것이 중요(처리할 작업량이 상당히 달라짐)
Inner Join : 어느 테이블을 먼저 읽어도 결과가 달라지지 않아 MySql 옵티마이저가 조인의 순서를 조절하여 다양한 방법으로 최적화
Outer Join : 반드시 Outer가 되는 테이블을 먼저 읽어야 하므로 옵티마이저가 조인 순서를 선택할 수 없다
가장 일반적인 Join의 종류이며 교집합
동등 조인(Equi-Join)이라고도 하며 N개의 테이블 조인시 N-1개의 조인 조건이 필요
-- 기본 형
select col1, col2, ... colN
from table1 Inner join table2
on table1.column = table2.column;
-- N개의 Inner Join을 위해서는 N-1개의 join 조건이 필요
select col1, col2, ..colN
from table1 Inner join table2 Inner join table3
on table1.column_a = table2.column_a
and table1.column_b = table3.column_b;
-- 컬럼명이 동일할 때 조인조건에서 컬럼명을 각 테이블별로 명시하지 않고
-- Using절 사용
select col1, col2, ... colN
from table1 Inner join table2
using (column);
-- using절에 alias나 table 이름을 명시하면 오류!
동일한 타입과 이름을 가진 컬럼을 조인조건으로 이용
반드시 두 테이블 간의 동일한 이름, 타입을 가진 컬럼이 필요
조인에 이용되는 컬럼을 명시하지 않아도 자동으로 조인에 사용
-- 기본형
select col1, col2, .. colN
from table1 natural join table2
-- 두 테이블 간의 동일한 이름의 컬럼이 자동으로 조인에 사용되므로
-- 이 컬럼의 타입과 의미가 같아야 한다
-- 예를 들어 사원 테이블의 manager 컬럼은 상사를 의미하고
-- 부서 테이블의 manager 컬럼이 부서장을 의미할 때 이를 자연조인 하면
-- 자연조인 조건에 부합하지 않기 때문에 원하지 않은 결과가 나올 수 있다
Left Outer join과 Right Outer join으로 나뉨
어느 한쪽 테이블에는 해당하는 데이터가 존재하는데 다른 쪽 테이블에는 데이터가 존재하지 않을 경우 그 데이터가 검색되지 않는 문제점을 해결하기 위해 사용
Outer join
-- Left Outer join 기본형
select col1, col2, .. colN
from table1 left outer join table2
-- on or using
-- Right Outer join 기본형
select col1, col2, .. colN
from table1 right outer join table2
-- on or using
-- full outer join -> mysql에서는 따로 기능이 없기 때문에
-- left outer join과 right outer join을 합집합
select col1, col2, .. colN
from table1 left outer join table2
union
select col1, col2, .. colN
from table1 right outer join table2
-- oracle에서 full outer join
select col1, col2, .. colN
from table1 full outer join table2
-- on or using
같은 테이블끼리 join할 때 사용
ex : 한 테이블에 사원 이름과 사원번호, 상사 번호가 있을 때, 상사 이름을 알고싶다면?
-- 한 사원의 상사 번호와 일치하는 사원번호를 찾아 이름과 함께 출력, 상사 번호가 없으면 사장!?
select e.employee_id, e.first_name, m.employee_id, m.first_name
from employees e join employyes m
on e.manager_id = m.employee_id;
테이블의 PK, FK가 아닌 일반 조건을 join 조건으로 지정 (공통 컬럼이 아닌 컬럼에 <, >, ≤, ≥, 등 비교연산자로 범위지정)
full table scan을 하기 때문에 속도가 느림
-- 사원 테이블의 급여에 대해 급여등급 테이블의 기준에 따라 급여등급을 부여하기
-- 이 때 사원 테이블과 급여등급 테이블은 같은 컬럼이 없기 때문에 동등조건을 주지 않는다
-- 대신 비교연산자로 조인 조건으로 준다 == None-Equi join
select e.employee_id, e.first_name, e.salary, s.grade
from employee e join salgrades s
on e.salary between s.lowsal and s.highsal
SELECT *
FROM table_name1, table_name2
WHERE table_name1.column [> | < | >= | <= ] table_name2.column;