오래 못 할 짓 하지 않기

[ 데이터베이스 ] 7. Join (좀 어려움 ㅠ) 본문

3학년 1학기/데이터베이스(DB)

[ 데이터베이스 ] 7. Join (좀 어려움 ㅠ)

쫑알bot 2024. 1. 2. 23:19
728x90

Join

 

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

 

 

● 종류

 

1) Implicit Join

: From   절에서는 사용될 Table만 나열

  Where 절에서는 Join condition 명시

[ From 절에서 ] Employee table이 Department table과 Join을 하는데 

dept_id와 id가 같은 것들만 Join을 한다. 

 

특징) from 절에서 On 뒤에 Join condition이 명시된다.

 

단점)

1. Where 절에서 Selection condition 과 Join condition 이 같이 있어서 가독성이 떨어진다

2. 조금만 복잡한 Join 쿼리를 작성하다보면 꼬일 가능성이 크다.

 

 

2) Explicit Join

: From 절에 Join 키워드와 함께 같이 쓸 Table들 명시

  + From 절에서 On 뒤에 join condition 이 명시된다.

 

장점)

1. 가독성이 좋다

2. 복잡해도 잘 안 꼬임

 


INNER JOIN

: 두 Table에서 Join condition 을 만족하는 Tuple로 Result table을 만드는 Join 

 → Join condition 에 대해 Null 값을 가지는 tuple은 result table에 포함되지 X (당연함)

 

● 사용법

: ... From [ Table1 ] ( INNER(생략가능) ) Join [ Table2 ] ON [ 조건 ] ...

 

Join 할 때 따로 Join을 안 넣으면 그냥 INNER JOIN으로 된다.

 

 

우선 E.dept_id = D.id인 곳에만 두 Table을 Join 하려고 한다.

하지만 1) Employee table에 있는 Simon은 dept_id가 없다.

            2) Department table에서 1002번 부서에 있는 사람이 Employee table에 없다.

 

따라서 위 명령어의 결과로는 아래와 같다

 


OUTER JOIN

: 두 Table에서 Join condition 을 만족하지 않는 Tuple들도 Result table에 포함하는 Join 

 

종류

1) ... From [ Table1 ] LEFT ( OUTER(생략가능) ) Join [ Table2 ] ON [ 조건 ] ...

→ Left 즉, Table1에서 조건이 안 맞는 것이어도 그냥 Result table에 넣는다.

추가) Table1에서 SIMON은 E.dept_id = D.id 조건에서 탈락이라해도 그냥 넣는다. 

 


 

 

2) ... From [ Table1 ] RIGHT( OUTER(생략가능) ) Join [ Table2 ] ON [ 조건 ] ...

 

추가) Table2에서 HR은 E.dept_id = D.id 조건에서 탈락이라해도 그냥 넣는다. 

 


 

 

3) ... From [ Table1 ] FULL ( OUTER(생략가능) ) Join [ Table2 ] ON [ 조건 ] ... 

   (Mysql에서는 FULL OUTER 지원 X)

 

 

그냥 어떻게든 합침 조건에 맞는 애들은 먼저 매칭하고, 안 되는 애들도 그냥 합쳐서 result table을 만든다.

 

 


EQUI JOIN

 

Join condition 에 = 를 사용하는 Join

 

두 가지 시각

1) 그냥 어느 Join이든 = 있으면 equi join

2) Inner join 에서 = 가 있으면 equi join

 

근데 주로 1로 씀

 

Using

 

두 Table이 Equi Join을 할 때, Attribute의 이름이 같다면, Using으로 간단하게 작성 가능

 

 

 

ex) 

Department 에 있는 id를 dept_id로 바꿔보자.

SELECT *  from employee E INNER JOIN department D On E.dept_id = D.dept_id;

여기에서 On 다음 부분을 바꿔보려고 한다.

왜냐면 둘 다 E,D table 둘 다 dept_id가 존재하기 때문에 중복을 없앨 수 있도록

 

SELECT *  from employee E INNER JOIN department D Using (dept_id);

 

결과는 아래와 같다

 

Using attribute로 묶인 dept_id라고 생각하여 

E와 D 둘 아무 곳에 안 속한다고 생각하면 편하다.

 

 

-  두 Table이 Equi Join할 때, Join 하는 attribute의 이름이 같으면, Using으로 간단하게 작성

 

 


NATURAL JOIN

두 개의 Table에서 같은 Attribute name에 대해 알아서 Equi join을 수행

그래서 굳이 Condition 을 안 달아도 된다.

 

이렇게 된다.

 

그럼 D테이블에서 dept_name을 name으로 다시 바꿔보자

그럼 두 테이블에 같은 attribute name이 2개가 된다. dept_id , name

이 때 natural join을 하면 아무 결과가 나오지 않는다.

 

▶ E.dept_id = D.dept_id and E.name = D.name이 성립해야하는데, 

부서 번호가 서로 같은 것 까진 가능, 부서 이름과 사람 이름이 같은 곳은 없음

 

 


CROSS JOIN

두 table에서 tuple pair로 만들 수 있는 모든 조합을 result table로 반환

+ Join Condition X

 

- Implicit cross join : From table1, table2

- Explicit cross join : From table1 CROSS JOIN table2

 

Cross join 에 On을 쓰면 Inner Join으로 동작한다.

Inner Join에 On이 없으면 Cross Join

 

Cross Join이랑 Inner Join의 차이는 조건을 붙이냐 마느냐 차이

 


 

예제 1)

ID =1003인 부서의 직원들 중 리더 제외 부서원의 ID, 이름, 연봉을 알아내라

 

더보기

▶ 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;

 

 

 

 

예제 2) << 많이 복잡함

ID =2001 인 프로젝트에 참여한 직원들의 이름, 직군, 소속부서 이름을 알아내라

 

(내가 하다 만 거)

Select E.name , E.postion , D.name

From employee E , department D 

Where P.id = 2001 and P.id = E.id;

 

더보기

 Select E.name , E.postion , D.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;

 

 

 

 

(출처)

유튜브 쉬운코드