두 개 이상의 테이블을 연결해서 (연결된 테이블의) 데이터를 검색하는 방법
목적 : 현재 테이블에서 취득할 수 없는 컬럼의 데이터를 상대 데이터에서 취득하기 위함
종류 : **inner join full outer join cross join left / right outer join *self join
- 기본기( Primary key ) - ex) departments테이블에서 department_id
- 외래키( Forign key ) - ex) employees테이블에서 department_id
-- ansi
SELECT <열 목록>
FROM <A테이블>
INNER JOIN<B테이블>
ON <조인 조건>
[WHERE 검색조건]
-- mysql
SELECT <열 목록>
FROM <A테이블>, <B테이블>
WHERE <조인 조건>
-- ansi
SELECT <열 목록>
FROM <A테이블>
INNER JOIN<B테이블>
ON <조인 조건>
INNER JOIN<C테이블>
ON <조인 조건>
[WHERE 검색조건]
-- mysql
SELECT <열 목록>
FROM <기준 테이블>, <참조할 테이블>, <참조할 테이블>
WHERE <조인 조건1> AND <조인 조건2>
-- 2table join
-- ansi
select employee_id, first_name,
e.department_id, d.department_id,
d.department_name, d.location_id
from employees e inner join department d
on e.department_id = d.department_id;
-- mysql
select employee_id, first_name,
e.department_id, d.department_id,
d.department_name, d.location_id
from employees e, department d
where e.department_id = d.department_id;
-- 3table join
-- ansi
select e.employee_id, e.first_name,
e.department_id, d.department_id,
e.job_id, j.job_id,
d.department_name, j.job_title
from employees e inner join department d
on e.department_id = d.department_id
inner join jobs j
on e.job_id = j.job_id;
-- mysql
select e.employee_id, e.first_name,
e.department_id, d.department_id,
e.job_id, j.job_id,
d.department_name, j.job_title
from employees e, departments d, jobs j
where e.department_id = d.department_id
and e.job_id = j.job_id;
모든 경우의 수, 즉 A테이블 row 개수 X B테이블 row 개수 만큼의 row를 가진 테이블이 출력됨.
SELECT <열 목록>
FROM <A테이블>
CROSS JOIN<B테이블>
ON <조인 조건>
select employee_id, first_name,
e.department_id, d.department_id,
d.department_name
from employees e corss join departments d; -- 1000 row(s) returned
왼쪽 / 오른쪽 테이블
SELECT <열 목록>
FROM <A테이블>
LEFT OUTER JOIN<B테이블>
ON <조인 조건>
SELECT <열 목록>
FROM <A테이블>
RIGHT OUTER JOIN<B테이블>
ON <조인 조건>
-- left outer join
select employee_id, first_name,
e.department_id, d.department_id,
d.department_name
from employees e left outer join departments d
on e.department_id = d.department_id;
-- where e.department_id is null; -- 차집합
-- right outer join
select employee_id, first_name,
e.department_id, d.department_id,
d.department_name
from employees e right outer join departments d
on e.department_id = d.department_id;
SELECT <열 목록>
FROM <A테이블>
LEFT OUTER JOIN<B테이블>
ON <조인 조건>
UNION -- 사이에 'union'을 붙여주면 됨
SELECT <열 목록>
FROM <A테이블>
RIGHT OUTER JOIN<B테이블>
ON <조인 조건>
select employee_id, first_name,
e.department_id, d.department_id,
d.department_name
from employees e left outer join departments d
on e.department_id = d.department_id;
union
select employee_id, first_name,
e.department_id, d.department_id,
d.department_name
from employees e right outer join departments d
on e.department_id = d.department_id;
동일한 테이블을 조인
-- ansi
SELECT <열 목록>
FROM <A테이블> JOIN <A테이블>
ON <조인 조건>
-- mysql
SELECT <열 목록>
FROM <A테이블>, <A테이블>
WHERE <조인 조건>
select emp.first_name as 사원,
emp.manager_id, mgr.employee_id,
mgr.first_name as 상사
from employees emp, employees mgr -- emp: 사원 mrg: 상사
where emp.manager_id = mgr.employee_id;