[Oracle] 18.JOIN(1)


join



이제부터 join 연산에 대해 배워보겠습니다.

join 연산은 한 개 이상의 테이블을 연결해서 데이터를 가져오는 연산입니다.

join 연산은 CROSS JOIN, INNER JOIN, OUTER JOIN이 있습니다!

CROSS JOIN



CROSS JOIN은 카티션 프로덕트(Cartesian Product)로 알려져 있으며,

조인에 참여한 테이블들의 모든 데이터가 추출됩니다.

CROSS JOIN은 잘 사용하지 않는데, 목적과는 상관없는 결과이기 때문입니다.

CROSS JOIN이 발생하는 상황은 다음과 같습니다.


  • join 조건을 잘못 기술했을 때



  • join 조건을 정의하지 않았을 때



  • 조인 조건이 조인 조건에 참여하는 테이블의 모든 행이 조인되는 경우




SELECT
    *
FROM
    employees,
    departments;



또는


SELECT
    *
FROM
    employees
    CROSS JOIN departments;




image



크로스 조인 후 행의 갯수는 두 테이블의 행의 갯수를 곱한 것과 같습니다~

Inner Join=Equi Join



Inner Join은 테이블 간에 연결되는 속성을 지정해주거나 조건을 주어서 조건에 맞는 결과가 나오게 합니다!

가장 많이 사용됩니다~! 정말 중요해요!


Inner Join을 이용하기 위해서는 테이블 간에 공통되는 속성(꼭 이름이 같을 필요는 없음)이 존재해야합니다!


SELECT
    *
FROM
    employees,
    departments
WHERE
    employees.department_id = departments.department_id;



또는


SELECT
    *
FROM
    employees INNER JOIN departments 
    ON employees.department_id = departments.department_id;



또는


-- USING 절을 사용할 때는 공통되는 이름의 속성을 가지고 있어야함 --


SELECT
    *
FROM
    employees INNER JOIN departments 
    USING(department_id);



INNER JOIN 후 행의 수는 선행테이블의 행의 수와 같습니다(속성이 null인 것은 제외)

예제를 해볼까요?


--사원이름과 부서이름 가져오기--

SELECT
    employees.first_name|| ' '|| employees.last_name "사원이름",
    departments.department_name "부서이름"
FROM
    employees,
    departments
WHERE
    employees.department_id = departments.department_id;




image




테이블 별칭 주기



같은 테이블 끼리도 조인 연산이 가능한데, 서로 구분하기 위해서 별칭을 줄 수 있습니다.

또, 보통 이름이 같지 않아도 테이블 명을 붙여주면 좋습니다!

테이블 명 별칭은 속성과 다르게 as로 줄 수는 없습니다!


-- 사원번호, 사원 명, 상사번호, 상사 명을 조회 --

SELECT
    emp1.employee_id "사원번호",
    emp1.first_name|| ' '|| emp1.last_name "사원 명",
    emp1.manager_id "상사번호",
    emp2.first_name|| ' '|| emp2.last_name "상사 명"
FROM
    employees emp1, --테이블 별칭
    employees emp2 --테이블 별칭
WHERE
    emp1.manager_id = emp2.employee_id;




image



위의 결과를 보면 상사가 없는 사원은 검색이 되지 않았습니다~

그 이유는 선행테이블의 연결되는 속성값이 null인 것은 검색이 되지 않아서 그런 것인데요!

이것은 다음 장에서 배울 OUTER JOIN 을 이용하면 해결할 수 있습니다~!



다음과 같이 같은 테이블이 아니어도 별칭을 줄 수 있습니다.


SELECT
    emp.job_id "직책",
    first_name|| ' '|| last_name "사원 명",
    email,
    TO_CHAR(salary,'L999,999,999') "급여",
    job_title "직책 명"
FROM
    employees emp, -- 테이블 별칭 EMP
    jobs job -- 테이블 별칭 JOB 
WHERE
    emp.job_id = job.job_id;




image



예제




  • 성이 John인 사람의 부서명을 출력




SELECT
    first_name|| ' '|| last_name "사원이름",
    department_name "부서이름"
FROM
    employees,
    departments
WHERE
    first_name = 'John'
    AND employees.department_id = departments.department_id;




image




  • 뉴욕에서 근무하는 사원의 이름과 급여를 조회




SELECT
    emp.first_name||' '||emp.last_name "사원이름",
    salary "급여",
    loca.city "근무지"
FROM
    employees emp,
    departments dept,
    locations loca
WHERE
    emp.department_id = dept.department_id
    AND dept.location_id = loca.location_id
    AND loca.city = 'London';




image



위와 같이 테이블 2개뿐만 아니라 3개이상도 조인 연산이 가능합니다!