본문 바로가기

BackEnd/DataBase - Oracle

[Oracle] JOIN과 Self-Join

JOIN

두 개 이상의 테이블을 연결하여 데이터를 조회할 때 사용하는 구문

아래 예문을 통해 알아보자

 

SELECT dept.department_id, dept.department_name, dept.location_id, 
loca.location_id, loca.city 
FROM departments dept JOIN locations loca 
ON dept.location_id = loca.location_id;


departments 테이블의 별칭은 dept
JOIN하는 locations 테이블의 별칭은 loca

보여줄 컬럼은,
departments 테이블의 department_id, department_name
locations 테이블의 location_id, city

JOIN 시 연결시켜줄 조건은,
departments 테이블의 location_id와
locations 테이블의 location_id가 같을 때 연결시켜준다

즉, departments의 테이블에 location_id(지역 구분번호)가 있는데
이 지역 구분번호의 지역명은 이 테이블이 명시되어 있지 않아서
location_id의 지역명이 담긴(city) 정보를 같이 연결하여 불러오고 싶은데
두 테이블의 서로 정확히 일치하는 정보는 location_id라 같이 묶어준 것이다

어느 하나의 테이블에서 여러 개의 테이블을 참조하려면 어떻게 할까?
구문이 길어지고 복잡해서 끊어서 써보았다

SELECT emp.employee_id, emp.last_name, 
dept.department_id, dept.department_name, dept.location_id, 
loc.city, loc.country_id, 
cou.country_name, cou.region_id,  
reg.region_name 

FROM employees emp 

JOIN departments dept 
ON emp.department_id = dept.department_id 

JOIN locations loc 
ON dept.location_id = loc.location_id 

JOIN countries cou 
ON loc.country_id = cou.country_id 

JOIN regions reg 
ON cou.region_id = reg.region_id; 


FROM emp

JOIN dept
ON emp와 dept의 동일한 값을 가진 연결 컬럼

JOIN loc
ON dept와 loc의 동일한 값을 가진 연결 컬럼

JOIN cou
ON loc과 cou의 동일한 값을 가진 연결 컬럼

JOIN reg
ON cou와 reg의 동일한 값을 가진 연결 컬럼

천천히 해석해보면 서로가 통일된 동일한 값을 가져 하나의 행 처럼 연결할 수 있는 것이다
선JOIN 후JOIN의 연결 가능한 고정 값이 있다면 가능한 영역까지 계속 연결이 가능하다

 

 

 


Self-Join

다른 테이블을 참조하는 것이 아닌 자신의 테이블의 행끼리 연결할 때 사용하는 구문

하나의 테이블에 연관지어서 연결할 수 있는 컬럼이 있는 경우 같은 테이블이라도 행과 행끼리 연결한 결과를 얻을 수 있다.

예제) employees 테이블의 manager_id 컬럼은 해당 행의 사원을 관리하는 매니저 사원의 employee_id 정보이다
매니저의 직책을 가지는 사원도 마찬가지로 사원이기 때문에 employees 테이블에 속해있다
사원과 사원을 관리하는 매니저의 정보를 연결해서 보고 싶다면,

사원의 정보 중 manager_id에 있는 값과 동일한 employee_id의 값을 가지는 행을 선택하고 조인하여 결과를 얻을 수 있다

SELECT 부하직원.employee_id, 부하직원.last_name,  
매니저.employee_id, 매니저.last_name 
FROM employees 부하직원 JOIN employees 매니저 
ON 부하직원.manager_id = 매니저.employee_id; 


매니저.manager_id는 매니저의 사원번호(employee_id)가 나온다