괴발개발

[강의 정리]D-52 DB#3 (join) 본문

BACK END/DB

[강의 정리]D-52 DB#3 (join)

dinoelll 2023. 3. 22. 11:45

[목차]

join

0. cross join

1. equi join

   1) 등가조인

   2) 내부조인

   3) nutural join

2. outer join (외부 조인)

   1) left outer join 

   2) right outer join

   3) full outer join


dept, emp

 

[특징]

1. 동일한 컬럼이 존재해야 한다.

2. 그래서 pk와 fk를 활용한다.

0. cross join (준비단계)

🎃 안쓰이고, 카다시안 곱을 수행함

ex) 4x10 나올 수 있는 조합을 반환함.

select emp.ename, dept.deptname from emp e cross join dept d;

[cross join] 생략 가능
select e.ename, d.deptname from emp e , dept d;

1. join

1) 등가조인

[사용]

=

[특징] 

emp의 특정 데이터가 가지고 있는 데이터 주에서 deptno가 같은 것만 보여줘!

 

select e.ename, d.deptname from emp e , dept d where e.deptno = d.deptno ;

2) 내부조인

[사용]

1. inner join 넣고 + on 넣고 (where 대신)

2. inner ,on빼고 using 넣고

✨걍 join으로 변형만 해준 것 

1.
select e.ename, d.deptname from emp e inner join dept d on e.deptno = d.deptno ;

2.
select e.ename, d.deptname from emp e join dept d using (deptno) ; -- > 요거 정도 많이 쓰임

3) natural join

[사용]

join 빼고 ,

nutural join 만 !!

 

어차피 자연스럽게 들어갈꺼 걍 빼자! , 

근데 , 이건 코드의 가시성과 가독성이 너무 떨어진다.!

 

select e.ename, d.deptname from emp e natural join dept d ;

2. outer join (외부 조인)

1) right outer join

오른쪽 테이블을 기준으로 더 많은 데이터를 보여줌

💎 그냥 데이터가 많다는게 아니라, 

공통된 데이터가 아닌 , 오른쪽에 사용하지 않은 데이터가 더 있어 더 보여줘야 된다는 의미임!

 

+++ 오른쪽 왼쪽의 기준은!!@!! from 에 들어가는게 왼쪽이고 , 그 오른쪽에 들어가는 조건이 오른쪽이 됨.

()

select d.deptno , e.ename , d.deptname  from dept d  left outer join emp e
on e.deptno = d.deptno ;

 

select d.deptno, e.ename, d.deptname from emp e right outer join dept d 
on e.deptno = d.deptno;

-- outer는 생략 가능

2) left outer join 

왼쪽 테이블을 기준으로 더 많은 데이터를 보여줌

select e.deptno , e.ename , d.deptname  from emp e left outer join dept d 
on e.deptno = d.deptno ;

 

+++ 오른쪽 왼쪽의 기준은!!!! from 에 들어가는게 왼쪽이고 , 그 오른쪽에 들어가는 조건이 오른쪽이 됨.

()

select d.deptno , e.ename , d.deptname  from dept d  left outer join emp e
on e.deptno = d.deptno ;

 

 

 

 

 

 

** 이거 부모가 없는 값은 자식은 가지고 있지 않아서 

이상한 부모 자식 관계 끊어주는 행위함. [더보기 참고]

더보기

-- 부모 자식 관계를 삭제(FK 삭제)

-- aLTER TABLE [테이블명] DROP CONSTRAINT [제약조건 이름]

select * from information_schema.table_constraints where TABLE_NAME = 'emp' ;

alter table emp drop constraint emp_ibfk_1;

 

-- dept 테이블에 없는 값을 emp 테이블에 추가(부모자식 관계라 안될 거임)

insert into emp (ename, job, deptno, hiredate)

values('kim','manager',6 , str_to_date('14-05-02','%Y-%m-%d'));

 

3) full outer join 

🎇양쪽에 없는걸 다 보여주고 싶을 경우에는 full outer join을 사용! 

but, (mariadb와 mysql에서는 지원하지 않음) 대신, union을 이용해서 같은 효과를 낸다.

 

+ self join (자기 조인)

1. 등가 조인과 같다.

2. 두 개의 테이블이 아닌 하나의 테이블을 대상으로 한다.

3. 자기 데이터에 카다시안 곱을 해줌

 

select 
	a.deptno
	,a. ename 
	,b. job 
from emp a, emp b where a.deptno = b.deptno;
Comments