오래 못 할 짓 하지 않기
[ 데이터베이스 ] 7. Join (좀 어려움 ㅠ) 본문
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;
(출처)
유튜브 쉬운코드
'3학년 1학기 > 데이터베이스(DB)' 카테고리의 다른 글
[ 데이터베이스 ] 9. stored function (0) | 2024.01.04 |
---|---|
[ 데이터베이스 ] 8. 데이터 조회 - Group/ Aggregate / Order (0) | 2024.01.03 |
[ 데이터베이스 ] 6. NULL / 3 valued logic (0) | 2023.12.31 |
[ 데이터베이스 ] 5. Subquery (0) | 2023.12.31 |
[ 데이터베이스 ] 4. SQL 활용 ( 추가/수정/삭제 ) (0) | 2023.12.30 |