ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DB] Join 종류 공부하기
    DBMS/데이터베이스 이론 2025. 1. 12. 10:41

     

     

    Join 종류 공부하기

     



    Join

    두 개 이상의 테이블에 있는 데이터를 합쳐서 한 번에 조회하는 것 


    Implicit join

    SELECT D.name
    FROM employee E, department D
    WHERE E.id = 1 AND E.dept_id = D.id


    -조인 테이블을 FROM문에 Join condition(조인조건)을 WHERE문에 작성하는 방식

    -Old style 조인 문법

    -WHERE문에 selection condition과 join condition이 같이 있기 떄문에 가독성이 떨어진다

    -가독성이 떨어지니 복잡한 join 쿼리를 작성하다보면 실수로 잘못된 쿼리를 작성할 가능성이 높다.


     

    Explicit join

    SELECT D.name
    FROM employee E 
    JOIN department D
    ON E.dept_id = D.id
    WHERE E.id=1;


    -FROM문에 JOIN 키워드와 함께 join된 테이블들을 명시하는 방식

    -FROM 절에서 ON 뒤에 join condition이 명시된다

    -가독성이 좋다

    -복잡한 join쿼리 작성에도 실수할 가능성이 적다


     

     

    Inner join

    -두 테이블에서 join condition을 만족하는 tuple들로 result table을 만드는 join
    (Join condition을 만족하는 튜플만 가져오는 조인)

    FROM table1 [INNER] JOIN table2 ON join_condition

     

    (inner join은 기본조인으로 inner은 안써도 inner 조인이 적용된다)

    -join condition에서 null값을 가지는 tuple은 result table에 포함되지 못한다 

    - inner Join condition에서 사용 가능한 연산자: =, <,>,!=

     

    Outer join

    -두 테이블에서 join condition을 만족하지 않는 tuple들도 result table에 포함하는 join
    (Join condition을 만족하지않는 튜플도 가져온다.)

     

    -Join condition을 만족하지 않은 상대 테이블과 매칭되지 않는 튜플은 상대 테이블에 대한 속성을 모두 null로 가져온다

     

    Outer join의 종류 3가지


    [outer] 역시 생략가능하다

    1.LEFT [OUTER] JOIN: 왼쪽 테이블에서 매칭되지 못한(조인조건 만족 못하는) 튜플도 가져온다

     


    2. RIGHT [OUTER] JOIN: 오른쪽 테이블에서 매칭되지 못한(조인 조건 만족못하는) 튜플도 가져온다

     


    3. FULL [OUTER] JOIN: 양쪽테이블에서 매칭되지못한(조인 조건만족 못하는) 튜플도 가져온다
    (MYSQL은 FULL OUTER JOIN을 지원하지 않는다. PSQL은 지원.)


    outer Join condition에 사용가능한 연산자: =,<,>,!=



     

    Equi join

    Join condition에서 =연산자를 사용하는 join


     

    Using

    두 테이블이 equi join을할 때 join하는 속성의 이름이 같다면 USING으로 간단하게 작성할 수 있다.
    이때 같은 이름의 attribute는 result table의 맨 앞에서 한번만 표시된다.

    2개이상의 속성을 조인조건으로 쓴다면 USING 에 추가 속성명을 적으면 된다. USING(속성1, 속성2...)

    FROM table1 [INNER] JOIN table2 USING(속성)
    FROM table1 LEFT [OUTER] JOIN table2 USING(속성)

     




    Natural join

     

    두 테이블에서 같은 이름을 가지는 *모든 attribute pair에 대해서 equi join을 수행

    Join condition을 따로 명시하지 않는다

     

    FROM table1 NATURAL [inner] JOIN table2
    FROM table1 NATURAL LEFT[OUTER] JOIN table2




     

     

     

    Cross join

    -두 tuple의 tuple pair로 만들 수 있는 모든 조합(Cartesian product)을 result table로 반환한다

    -Join condition이 없다


    Implicit cross join

    FROM table1, table2




    Explicit cross join

    FROM table1 CROSS JOIN table2

     




    MYSQL에서의 cross join


    -MYSQL에서는 cross join = inner join = join 

    -CROSS JOIN에 ON(or USING)(조인 조건이 있다면)을 같이 쓰면 inner join으로 동작한다

    -Inner JOIN(or JOIN)이 ON (or USING)(조인 조건이 없다면) cross join으로 동작한다


     

    Self join

    table이 자기 자신에게 join하는 경우



     

    조인예제

    예제에 사용될 테이블

    (부서, 직원, 프로젝트, 프로젝트 참여 목록)

    DEPARTMENT
    id, name, leader_id
    EMPLOYEE
    id, name, birth_date, sex, position, salary, dept_id
    Project
    id, name, leader_id, start_date, end_date
    WORKS_ON
    empl_id, proj_id

     

    Q) ID가 1003인 부서에 속하는 임직원중 리더를 제외한 부서원의 ID, 이름, 연봉을 알고싶다.

    SELECT id, name, salary
    FROM EMPLOYEE E
    JOIN DEPARTMENT D
    ON D.ID = E.DEPT_ID
    WHERE D.ID=1003 AND E.id != D.leader_id;


     

    Q) ID가 2001인  프로젝트에 참여한 임직원들의 이름과 직군과 소속 부서 이름을 알고 싶다

    SELECT E.name, E.position, D.name
    FROM employee E
    JOIN works_on W
    ON W.empl_id = E.id
    LEFT JOIN department D
    ON E.dept_id = D.id
    WHERE W.proj_id = 2001;



    LEFT JOIN을 쓰는 이유
    EMPLOYEE 테이블에 dept_id가 null인 튜플도 있을 수 있다.














Designed by Tistory.