스터디/DB(ORACLE) ORACLE JOIN(Inner join,Outer Join,Self Join) 고무곰(GomuGom) 2017. 9. 5. 14:02 --조인(JOIN) -- : n개의 테이블간에 필요한 컬럼 정보를 하나로 출력하기 위해 사용됨 -- [ Inner JOIN ] : 완전히 일치하는 데이터만 나오는 방식(일반적인 조인 방식) select e.First_name, e.Last_name, e.Email 이메일, d.DEPARTMENT_NAME 부서명 from Employees e, Departments d where e.DEPARTMENT_ID = d.DEPARTMENT_ID; -- 두 정보가 완전히 일치하는 정보들만 출력됨 -- 즉, 이 경우는 값이 다른 값들은 출력되지 않음 -- 단순히 부서명 컬럼이 하나 더 필요해서 조인을 하는 경우는 이렇게하면 출력되지 않는 값들이 생겨 -- 원하는 데이터들을 뽑아내지 못할 수 있다. select emp.first_name || emp.last_name 이름, emp.email 이메일, emp.department_id, dep.department_name 부서명, j.job_title 직급, l.CITY 지역 from Employees emp, Departments dep, jobs j, locations l where emp.department_id = dep.department_id and emp.job_id = j.job_id and dep.location_id = l.location_id -- 여기까지 조인조건 and l.city = 'Seattle'; -- 일반조건 --[ Self JOIN ] -- 자신의 테이블에서 자신의 테이블을 조인해서 사용하는 방식 -- 왜 필요?? -- ex) Employees 테이블에서 한 튜플의 직원 정보에서 그 사람의 상급자인 manager_id값이 있다. -- 이 manager_id는 상급자의 사원번호인데 이 사원번호 정보는 동일 테이블인 Employees에 있다. -- 왜? 상급자도 직원이기 때문에 같은 테이블에 정보가 있고 따라서 같은 테이블을 참고할 일이 생김 -- 아래의 경우, 셀프조인을 하지 않으면 emp2.FIRST_NAME인 상사의 이름에 해당하는 필드는 가져올 방법이 없다. select emp1.EMPLOYEE_ID, emp1.FIRST_NAME, emp2.EMPLOYEE_ID 상사ID, emp2.FIRST_NAME 상사이름 from Employees emp1, Employees emp2 where emp1.manager_id = emp2.employee_id; ------------------------------------------------------------------------------------------ --[ Outer JOIN(외부 조인) ] -- left outer join, right outer join, full outer join이 있다. -- full outer join은 ANSI 표준 문법으로만 작성이 가능하고 ORACLE 전용 문법으로는 불가능하다. select emp.employee_id, emp.first_name, emp.department_id, dep.department_name from Employees emp, departments dep where emp.department_id = dep.department_id; -- 106명 출력 select * from Employees; -- 107명 -- 왜 106명 107명 다를까? 둘다 완전히 일치한 경우만 출력되기 때문(inner join), null값인 경우 출력안됐을 것... -- 따라서, 이런 경우 Outer Join 방식을 사용해야 함 select emp.employee_id, emp.first_name, emp.department_id, dep.department_name, loc.CITY from Employees emp, departments dep, locations loc where emp.department_id = dep.department_id (+) and dep.location_id = loc.location_id (+); -- 즉, 이러한 방식은 Oracle 전용 문법임, ANSI 표준은 from에 left outer join혹은 right outer join식으로 써야함 -- 즉, 오라클 문법에서 outer join은 (+)로 나타내며, 전부 출력되어야 하는 테이블의 반대편에 붙여주게 된다. -- ANSI 표준 방식으로 작성한 3중 left outer join select emp.employee_id, emp.first_name, emp.department_id, dep.department_name, loc.city from Employees emp left outer join departments dep on emp.department_id = dep.department_id left outer join locations loc on dep.location_id = loc.location_id; 저작자표시 비영리