[DB] join

RepDay1·2023년 3월 26일
0

데이터베이스

목록 보기
3/4

회사 정보 테이블 스키마

SQL에서 Join?

  • 두 개 이상의 테이블들에 있는 데이터를 한 번에 조회하는 것
  • implicit join
    - from절에는 table들만 나열하고 where절에 join condition을 명시하는 방식
    - old-style join systax
    - where절에 selection condition과 join condition이 같이 있기 때문에 가독성이 떨어짐
    - 복잡한 join 쿼리를 작성하면 실수할 여지가 많음
    -ex
    SELECT D.name
    FROM employee AS E, department AS D
    WHERE E.id = 1 and E.dept_id = D.id;
  • explicit join
    from절에 join키워드와 함께 joined table들을 명시하는 방식
    - from절에 ON 뒤에 join condition이 명시 됨
    - 가독성이 좋음
    - 실수할 여지가 적음
    - ex
    SELECT D.name
    FROM employee AS E JOIN department AS D ON E.dept_id = D.id
    WHERE E.id = 1;

inner join

두 테이블에서 join condition을 만족하는 튜플들로 result table을 만드는 join

  • FROM table1 [inner] JOIN table2 ON join_condition
  • join condition에서 null값을 가지는 tuple은 result table에 포함되지 못한다.

outer join

  • 두 table에서 join condition을 만족하지 않는 tuple들도 result table에 포함하는 join

  • FROM table1 LEFT [OUTER] join table2 ON join_condition
    -> 조건에 만족하지 않는 왼쪽(table1)테이블의 튜플도 포함.

  • FROM table1 RIGHT [OUTER] join table2 ON join_condition
    -> 조건에 만족하지 않는(table2)테이블의 튜플도 포함.

  • FROM table1 FULL [OUTER] JOIN table2 ON join_condition
    -> 조건에 만족하지 않는 각 테이블의 튜플도 포함.
    (mysql에서는 FULL OUTER JOIN을 지원하지 않음.)

  • Ex(Left outer join)

SELECT * 
FROM employee E LEFT OUTER JOIN department D ON E.dept_id = D.id;

--> result table

Simon의 경우 join condition에 부합하지 않지만 LEFT JOIN이기 때문에 result table에 포함됨, 이때 E의 속성은 기존 속성 그대로 가져오고 D에 대한 속성은 모두 NULL로 처리.

그 외

  • equi join
    join contion에 = 를 사용하는 join

  • using 키워드
    - 두 테이블이 equi join을 할때 join하는 속성의 이름이 같을때 사용할 수 있는 키워드
    - EX : department 테이블의 id 속성을 dept_id로 변경하면, 다음과 같은 쿼리문으로 바꿀 수 있음

SELECT *
FROM employee E INNER JOIN department D USING (dept_id);

--> result

같은 이름의 속성은 result table에서 using속성으로 한번만 표시됨

  • natural join
    - 두 테이블에서 같은 이름을 가지는 모든 속성 쌍에 대해 equi join을 수행하는 join
    - join condition을 따로 명시하지 않음
    - FROM table1 NATURAL Join table2
    - EX: 아래 두 쿼리문은 동일한 의미를 가짐

    SELECT *
    FROM employee E NATURAL INNER JOIN department D;
    SELECT *
    FROM employee E INNER JOIN department D ON E.dept_id = D.dept_id AND E.name = D.name;
  • cross join
    - 두 테이블의 tuple pair로 만들 수 있는 모든 조합(= Cartesian product)을 result table로 반환함
    - join condition이 없음
    - implicit cross join : FROM table1, table2
    - explicit cross join : FROM table1 CROSS JOIN table2
    - EX :

    SELECT *
    FROM employee CROSS JOIN department; (explicit)
    SELECT *
    FROM employee, department (implicit)

    -> result table

  • mysql 에서 cross join
    - mysql에서는 cross join == inner join == join 임
    - CROSS JOIN에 ON(or USING)을 사용하면 INNER 방식으로 동작함
    - INNER JOIN(or JOIN)이 ON(or USING) 없이 사용되면 CROSS JOIN으로 동작하게됨

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

Ref.
"쉬운코드"님의 백발백중 시리즈

profile
미래의 나를 위한 블로그~.~

0개의 댓글