Published 2020. 5. 19. 20:00
728x90
반응형

inner join과 outer join

두 개 이상의 테이블을 조인할 때, 일치하는 값이 없는 행은 조인에서 제외됨

이것을 inner join이라고 하며, 명시적으로 사용하지 않을 시에는 기본적으로 inner join임
하지만 일치하지 않은 값 또한 join에 포함시킬 수도 있음

이것을 outer join이라고 하며, 반드시 outer join임을 명시해야 함

 

 

inner join

교집합 

기준컬럼값이 null이거나 상응하는 컬럼값이 없는 경우는 제외됨(유령부서 떠올리기)

select distinct dept_id
from employee E join department D  
     on E.dept_code = D.dept_id;

 


outer join 

합집합


left (outer) join  

dept_code가 null인 사원 2행 추가(department 테이블 컬럼은 모두 null처리됨)

select *
from employee E left outer join department D
     on E.dept_code = D.dept_id;


right (outer) join 

D3, D4, D7에 상응하는 employee행이 없으므로, 모두 null처리된 행을 추가

select *
from employee E right join department D
     on E.dept_code = D.dept_id;

 

full (outer) join 

모든 행 추가

select *
from emoloyee E full join department D
     on E.dept_code = D.dept_id;

 


cross join (자주사용 X) 

카테이션곱(Cartensian projuct)라고도 함

모든 경우의 수 (그룹함수의 결과와 일반함수 같이 보고 싶을때 사용)

검색되는 데이터 수는 행의 컬럼수 X 행의 컬럼수로 나옴

Lefr Table(n) * Right Table(m) => n*m 행의 조인테이블

select *
from employee E cross join department D;

 


self join

같은 테이블을 조인함

즉, 좌 우측 테이블이 동일하면 self join

 

예제)사원별 관리자의 이름 조회

select E.emp_id,
       E.emp_name,
       E.manager_id,
       M.emp_id,
       M.emp_name
from employee E left join employee M
     on E.manager_id = M.emp_id
order by E.emp_id;


multiple join

다중 join

 

예제)사원명, 부서명, 근무지역명을 조회

select E.emp_name,
       D.dept_title,
       L.local_name
from employee E 
     left join department D
        on E.dept_code = D.dept_id
     left join location L
        on D.location_id = L.local_code;  --한 번 left join은 영원한 left join
반응형

'프로그래밍 > SQL' 카테고리의 다른 글

05.21(SUBQUERY)  (0) 2020.05.21
05.20(SUBQUERY)  (0) 2020.05.20
05.18(join)  (0) 2020.05.18
05.15(union, union all, intersect, minus)  (0) 2020.05.15
05.14(group by & having)  (0) 2020.05.14
복사했습니다!