본문 바로가기

DATABASE

SQL로 데이터 조회하기! join의 의미와 여러 종류의 join들을 쉽게 정리해서 설명합니다! (4)

728x90
반응형
SMALL

이 글은 다음 영상을 참고해 작성하였습니다.

https://youtu.be/E-khvKjjVv4

join?

SQL에서 JOIN이란?

- 두 개 이상의 table들에 있는 데이터를 한 번에 조회하는 것

- 여러 종류의 JOIN이 존재한다

implicit join vs explicit join

- implicit join : from 절에는 table들만 나열하고 where절에 join condition을 명시하는 방식

- old-style join syntax

- where절에 selection condition과 join condition이 같이 있기 때문에 가독성이 떨어진다

- 복잡한 join쿼리를 작성하다 보면 실수로 잘못된 쿼리를 작성할 가능성이 크다

때문에 join을 명시할 수 있는 explicit join이 나온다

다음은 implicit join문을 explicit join으로 작성한 쿼리문이다.

mysql> SELECT D.name
    -> FROM employee E, department D
    -> WHERE E.id = 1 and E.dept_id = D.id;
mysql> SELECT D.name
    -> FROM employee AS E JOIN department AS D ON E.dept_id = D.id
    -> WHERE E.id = 1;

- explicit join : from 절에 JOIN키워드와 함께 joined table들을 명시하는 방식

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

- 가독성이 좋다

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

 inner join vs outer join

- inner join : 두 table에서 join condition을 만족하는 tuple들로 result table을 만드는 join

- FROM table1 [INNER] JOIN table2 ON join_condition

- join condition에 사용 가능한 연산자(operator) : =, <. >, != 등등 여러 비교 연산자가 가능하다

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

outer join

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

* FROM table1 LEFT [OUTER] JOIN table2 ON join_condition

* FROM table1 RIGHT [OUTER] JOIN table2 ON join_condition

* FROM table1 FULL [OUTER] JOIN table2 ON join_condition

* join condition에 사용 가능한 연산자(operator) : =, <, >, != 등등 여러 비교 연산자가 가능하다

※ MySQL은 FULL OUTER JOIN을 지원하지 않는다.

equi join

- join condition에서 = (equality comparator)를 사용하는 join

equi join에 대한 두 가지 시각

- inner join outer join 상관없이 = 를 사용한 join이라면 equi join으로 보는 경우

- inner join으로 한정해서 =를 사용한 경우에 equi join으로 보는 경우

using

mysql> select *
    -> from employee E INNER JOIN department D USING (dept_id);

employee, department 두 테이블에 dept_id라는 같은 속성이 있다면 결과로 하나의 dept_id열이 한 번만 맨 처음에 출력되어 결과를 가져온다.

- 두 table이 equi join 할 때 join 하는 attribute의 이름이 같다면, USING으로 간단하게 작성할 수 있다

- 이때 같은 이름의 attribute는 result table에서 한 번만 표시된다.

- FROM table1 [INNER] JOIN table2 USING (attribute(s))

- FROM table1 LEFT [OUTER] JOIN table2 USING (attribute(s))

- FROM table1 RIGHT [OUTER] JOIN table2 USING (attribute(s))

- FROM table1 FULL [OUTER] JOIN table2 USING (attribute(s))

natural join

- 두 table에서 같은 이름을 가지는 모든 attrubute pair에 대해서 equi join을 수행

- join condition을 따로 명시하지 않는다

- FROM table1 NATURAL [INNER] JOIN table2

- FROM table1 NATURAL LEFT [OUTER] JOIN table2 

- FROM table1 NATURAL RIGHT [OUTER] JOIN table2 

- FROM table1 NATURAL FULL [OUTER] JOIN table2 

cross join

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

- join condition이 없다

- implicit cross join: FROM table1, table2

- explicit cross join: FROM table1 CROSS JOIN table2

cross join @ MySQL

- 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 하는 경우

join example

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

mysql> SELECT E.id, E.name, E.salary
    -> FROM employee E JOIN department D ON E.dept_id = D.id
    -> WHERE E.dept_id = 1003 AND E.id != D.leader_id;

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

mysql> SELECT E.name AS empl_name,
    ->          E.position AS empl_position,
    ->          D.name AS dept_name
    -> FROM works_on W JOIN employee E ON W.empl_id = E.id
    ->                  LEFT JOIN department D ON E.dept_id = D.id
    -> WHERE W.proj_id = 2001;

 

728x90
반응형
LIST