Joins
Join
절은 둘 이상의 테이블 간에 관련된 열을 기준으로 행을 결합하는 데 사용됩니다.
(inner) join | 두 테이블 모두에 일치하는 값이 있는 레코드를 반환합니다 |
left (outer) join | 왼쪽(driving) 테이블에서 모든 레코드를 반환하고, 오른쪽 테이블에서 일치하는 레코드를 반환합니다 |
right (outer) join | 오른쪽(driven) 테이블에서 모든 레코드를 반환하고, 왼쪽 테이블에서 일치하는 레코드를 반환합니다 |
full (outer) join | 왼쪽 또는 오른쪽 테이블에 일치하는 레코드가 있을 때 모든 레코드를 반환합니다 |
employees, dept_emp, departments 조인
총 세 개의 테이블을 합치기 위해서 2회의 조인을 해야합니다.
select *
from employees
join dept_emp on emplyees.emp_no = dept_emp.emp_no;
select *
from employees
join dept_emp on employees.emp_no = dept_emp.emp_no
join departments on dept_emp.dept_no = departments.dept_no;
select employees.first_name, employees.last_name, departments.dept_name
from employees
join dept_emp on employees.emp_no = dept_emp.emp_no
join departments on dept_emp.dept_no = departments.dept_no
where employees.emp_no = 10001; // 조인 후!! 이 조건에 맞는 정보만 보여주는 것
Inner Join
Inner Join
키워드는 두 테이블 모두에서 일치하는 값을 가진 레코드를 선택합니다.
select count(*)
from employees
join dept_emp on employees.emp_no = dept_emp.emp_no
join departments on dept_emp.dept_no = departments.dept_no;
Left Join
Left Join
키워드는 왼쪽(driving) 테이블에서 모든 레코드를 반환하고 오른쪽(driven) 테이블에서 일치하는 레코드를 반환합니다. 일치하는 레코드가 없을 경우 오른쪽에서 0개의 레코드가 생성됩니다.
select count(*)
from employees
left join dept_emp on employees.emp_no = dept_emp.emp_no
left join departments on dept_emp.dept_no = departments.dept_no;
Right Join
Right Join
키워드는 오른쪽(drivrn) 테이블에서 모든 레코드를 반환하고 왼쪽(driving) 테이블에서 일치하는 레코드를 반환합니다. 일치하는 레코드가 없을 경우 왼쪽에서 0개의 레코드가 생성됩니다.
select count(*)
from employees
right join dept_emp on employees.emp_no = dept_emp.emp_no
right join departments on dept_emp.emp_no = departments.dept_no;
Full Join
Full Join (Full Outer Join)
키워드는 왼쪽(driving) 또는 오른쪽(driven) 테이블 레코드에 일치하는 레코드가 있을 때 모든 레코드를 반환합니다.
MySql 에선 Full Outer Join을 지원하지 않습니다. 하지만 Left Join과 Right Join을 Union하여 Full Join을 구현할 수 있습니다.
select *
from A left join B
union
select *
from A right join B;
(select count(*)
from employees
left join dept_emp on employees.emp_no = dept_emp.emp_no
left join departments on dept_emp.dept_no = departments.dept_no)
union
(select count(*)
from employees
right join dept_emp on employees.emp_no = dept_emp.emp_no
right join departments on dept_emp.dept_no = departments.dept_no)
Self Join
Self Join
은 자신의 테이블을 참조합니다.
select count (e1.emp_no)
from employees e1
join employees e2 on e1.first_name = e2.last_name;
Union, UnionAll
union
연산자는 둘 혹은 그 이상의 select
statements의 결과 집합을 합칠때 사용합니다. 말 그대로 합집합을 나타냅니다.
union
내의 모든select
statement 는 같은 수의 칼럼(column)을 가져야 합니다.- 칼럼들은 비슷한 데이터 타입을 가지고 있어야 합니다.
- 모든
select
statement의 칼럼은 그 순서도 같아야 합니다.
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
union
은 기본적으로 중복이 없습니다. 그렇기 때문에 중복되는 것도 모두 표시하려면 union all
을 사용해야 합니다.
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;