[Oracle] 19.JOIN(2)


NATURAL JOIN



저번 장에 이어서 조인에 대해 더 알아보겠습니다.

NATURAL JOIN은 조인 할 테이블들에 공통이름을 가진 속성이 있을 때,

조건을 명시하지 않고 자동으로 맵핑해주는 것입니다.


SELECT
    *
FROM
    employees
    NATURAL JOIN departments;




OUTER JOIN



OUTER JOIN은 조건이 맞지 않아도 값을 가져오기 위해서 사용됩니다!

LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있습니다!

예를들어 다음 두 테이블이 있다고 합시다.


image



두 테이블을 LEFT OUTER JOIN 하는 방법은 다음과 같습니다.


SELECT * 
FROM dept02 LEFT OUTER JOIN dept03
ON dept02.deptno = dept03.deptno;



또는


SELECT *
FROM dept02,dept03
WHERE dept02.deptno  = dept03.deptno(+);




image



결과를 보시면 DEPT02의 RESEARCH라는 부서가 DEPT03에 맵핑이 되지 않았지만 조회가 되고 있습니다!



이번에는, RIGHT OUTER JOIN을 해봅시다!


Select * 
From Dept02 Right Outer Join Dept03
On Dept02.Deptno = Dept03.Deptno;



또는


SELECT *
FROM dept02,dept03
WHERE dept02.deptno(+)  = dept03.deptno;




image



이번에는 DEPT03의 SALES 라는 부서가 DEPT02에 맵핑되지 않았지만 조회되고 있습니다!



맵핑되지 않은 행을 둘다 조회하고 싶으면 FULL OUTER JOIN을 이용합니다!


SELECT *
FROM dept02 FULL OUTER JOIN dept03
ON dept02.deptno = dept03.deptno;




image




예제




  • 사원명, 부서번호, 부서명을 출력하되, 사원이 없는 부서도 출력




SELECT
    first_name|| ' '|| last_name "사원 이름",
    departments.department_id "부서 번호",
    department_name "부서명"
FROM
    employees,
    departments
WHERE
    employees.department_id (+) = departments.department_id;




image




  • 도시별 사원수가 3명 이하인 도시이름과 사원수를 출력하되, 도시이름이 없어도 사원 수 출력




SELECT
    locations.city "도시",
    COUNT(*) "사원의 수"
FROM
    employees,
    departments,
    locations
WHERE
    employees.department_id = departments.department_id (+) --부서와 매핑안되는 사원도 조회
    AND departments.location_id = locations.location_id (+) --도시와 매핑안되는 부서도 조회
GROUP BY
    locations.city
HAVING
    COUNT(*) <= 3
ORDER BY
    COUNT(*);




image