07/08 조인 Join
1. 조인 join
테이블(뷰)와 테이블(뷰)를 합침
행과 행을 합치는 것(union연산자) x ⇒ 컬럼과 컬럼을 합침
데카르트곱(원소의 곱(모든 경우의 수)) ⇒ 데이터베이스에서는 catersian product라고 부름
- SQL 1992 CODE 방식나머지문법은 제품마다 다름
- 테이블(뷰)와 테이블(뷰)사이에 콤마(,) 찍어줌
- SQL 1999 CODE 방식(ANSI)ansi(표준화) SQL
- 테이블(뷰)와 테이블(뷰) 사이에 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문 컬럼을 사용)