카테고리 없음

07/08 조인 Join

달래dallae 2022. 7. 12. 18:48

1. 조인 join

테이블(뷰)와 테이블(뷰)를 합침

행과 행을 합치는 것(union연산자) x ⇒ 컬럼과 컬럼을 합침

데카르트곱(원소의 곱(모든 경우의 수)) ⇒ 데이터베이스에서는 catersian product라고 부름

  1. SQL 1992 CODE 방식나머지문법은 제품마다 다름
  2. 테이블(뷰)와 테이블(뷰)사이에 콤마(,) 찍어줌
  3. SQL 1999 CODE 방식(ANSI)ansi(표준화) SQL
  4. 테이블(뷰)와 테이블(뷰) 사이에 join이라는 단어를 넣어줌

만들어지는 행수 = 테이블1의 행수 * 테이블2의 행수

(데카르트곱 ⇒ 모든 경우의 수를 곱하기 때문에)

select *
from 테이블1, 테이블2
select *
from 테이블1 cross join 테이블2

cross join

그룹함수로 나온 1개의 행을 가지고 어떤 데이터값을 얻으려고 할 때 사용

select A.컬럼 - B.avg컬럼
from
( select * from ) A
cross join
( select avg컬럼 from ) B

테이블에 컬럼이 중복되어 있을 경우에는 어떤 테이블의 컬럼인지 정확하게 표기 (예>T.컬럼)


중복결과 피하기

select distinct 컬럼

with절 사용한 join

오라클에서만 사용가능

with
A as ( select문 ),
B as ( select문 )
select문
from A join B
on 조인조건절

2. Equi Join

공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결해서 결과를 생성하는 것

join조건절에서 연산자 = 사용


1992 code

join조건절 = where 사용

테이블에 컬럼이 중복되어 있을 경우에는 어떤 테이블의 컬럼인지 정확하게 표기 (예>T.컬럼)

select 
from table1 A, table2 B
where A.컬럼 = B.컬럼

주의 T의 비교컬럼이 null허용인 경우 ⇒ (+)사용

(+) ⇒ 제외

where T.비교컬럼 = E.비교컬럼(+)

⇒ 근데 E 조건절에 null인 컬럼은 조회가 안됨 ⇒ 1999 code로 사용


1999 code

join 조건절 = on 사용

1) 내부조인 inner join

1992 code 방식에서 (+)가 없는 것

inner는 생략가능 ⇒ 보통 생략하고 쓴다

select
from 테이블1 inner join 테이블2
on 조인조건절

select 
from 테이블1, 테이블2
where 조인조건절

2) 외부조인 outer join

1992 code 방식에서 (+)가 있는 것

null까지 조회하고 싶을 때

outer는 생략가능 ⇒ 보통 생략하고 쓴다

2-1) left outer join

select 
from 테이블1 left outer join 테이블2
on 조인조건절

1992code의 == where 테이블1 = 테이블2 (+)

2-2) right outer join

select 
from 테이블1 right outer join 테이블2
on 조인조건절

1992code의 == where 테이블1(+) = 테이블2

2-3) full outer join

select 
from 테이블1 full outer join 테이블2
on 조인조건절

1992code의 == where 테이블1(+) = 테이블2(+) ⇒ 그러나 이건 오류. 1992code 방식으로는 양쪽 테이블에 있는 모든 행들을 출력하는 것은 불가능.


주의 조인조건절 컬럼이 null 허용일 때

null은 조인조건절에서 비교연산자 사용이 불가능 ⇒ nvl을 해줘야한다

select문에서 nvl을 하면 바뀐 null값으로 메인쿼리에서 출력해야됨 ⇒ 조인조건절에서 nvl을 해야한다!!

select 컬럼
from ()A join ()B
on nvl(A.컬럼,-999) = nvl(B.컬럼,-999)

3. NON EQUI join

조인조건절에 사용되는 컬럼의 값이 특정한 범위에 속할때 사용

between A and B 사용 ( ‘=’는 안씀)

특정 범위에 속하면 자동으로 매핑해준다

null값은 범위 연산자로 비교할 수 없기 때문에 join조건절에서 nvl로 조건을 주어야 한다!

SQL 1992 code 방식

select B.컬럼
from A, B
where 컬럼 between B.조건컬럼1 and B.조건컬럼2

SQL 1999 code 방식

select B.컬럼
from A join B
on 컬럼 between B.조건컬럼1 and B.조건컬럼2

4. 자기조인 Self join

자기자신의 테이블(뷰)을 자기자신의 테이블(뷰)과 JOIN 반드시 테이블(뷰)에 대한 alias(별칭)를 달리 주어서 실행

1992 code 방식

select
from 테이블 A1, 테이블 A2
where A1.컬럼 = A2.컬럼2(+)

1999 code 방식

select
from 테이블 A1 join 테이블 A2
where A1.컬럼 = A2.컬럼2

5. 다중테이블 조인 Multi table join

3개 이상의 테이블(뷰)를 가지고 조인

부모테이블부터 시작하는게 좋음

⇒ 부모테이블에 있는 1개의 행이 다른 자식테이블에 여러 행으로 참조 가능

select
from 부모 P
join 자식 C1
on P.공통컬럼 = C1.공통컬럼
join 자식 C2
on C1.공통컬럼 = C2.공통컬럼
...

on 조인조건절에 null값인 행이 있으면 매번 left나 right join 조건을 넣어줘서 null값을 포함해 모두 출력되게 해야한다.

⇒ 부모절부터 하면 마지막 join에서 null값이 나오는 행을 한 번만 right 조건 걸어주면 됨. (오른쪽에 나오는 테이블을 모두 출력)

⇒ cf> 자식부터 하면 모든 join에 left를 조건걸어서 모든 null값이 나오게 해야한다.

간단하게 조건에 맞는것을 조회 ⇒ with 사용

with A as
(다중join한 select문)
select 컬럼
from A
where 조건절 (A select문 컬럼을 사용)