조인이란 ? 

     2개 이상의 테이블을 연결하여 하나의 테이블처럼 축력할때 사용

 

테이블명 :        1번테이블
사원번호 이름 부서번호
1 홍길동 101
2 임꺽정 102
테이블명 :           2번테이블
부서번호 내선번호 연봉 보너스 입사일
101 7854 5000 $200 1988-11-15
102 6589 3500 $500 1999-01-02

 

이렇게 2개의 테이블을 한번에 볼수있게 합치는게 조인이다.    (공통열 부서번호를 선택)

                                                                      ↓                             

사원번호 이름 부서번호 내선번호 연봉 보너스 입사일
1 홍길동 101 7854 5000 200 1988-11-15
2 임꺽정 102 6589 3500 500 1999-01-02

                                                               

 

이 2개 이상의 테이블을 합치는 방법이 1가지만 있는것이 아니니,

본인의 상황에 따라 잘(?) 선택하여 사용하는것이 좋겠다.

 

기본숙지사항 ★ ( 사용시에도 이순서로 사용해야된다)

select : 조회

from : 어느테이블에서가져올지 정의

where : select할 행을 선별하는 조건식

group by:  그룹화할 열 선택 ( 00 별 통계(?) 를 볼때 사용한다고보면됨 )

select 부서번호, count(*), MAX(연봉), SUM(연봉), AVG(연봉)
from 2번테이블
group by 부서번호, 내선번호

having : group by의 조건 ( 그룹의 출력을 제한하는 조건식 )

order by : 정렬하려는 열 지정 (asc, desc 선택) 

 

 

 

1. 등가조인 ( 내부조인, 단순조인으로 부르기도함)

첫 번째 테이블  <> 두번째테이블  일치하는 것만 조인하기 ( 특정열값이 일치한것만 출력 )

 ex) 첫 번째테이블 개수 50개

       두 번째 테이블 개수 13개 

단, 일치하는열은 13개뿐인 상황

조인을 한다면?  맞아떨어지는 결과는 13개의 행만 조회가 된다.

select * 
from 1번테이블, 2번테이블
where 1번테이블.부서번호 = 2번테이블.부서번호

  ※ 별칭 사용버전

select * 
from 1번테이블 a, 2번테이블 b
where a.부서번호 = b.부서번호

( 1번테이블 별칭 = a ,          2번테이블 별칭 = b)

 

※ 특정 열데이터만 출력하고 싶을때

정확히 몇번 테이블의 열인지 명시해야한다. 그렇지않으면 열의정의가 애매하여 에러발생

select a.이름, a.나이, b.연봉, b. 보너스
from 1번테이블 a, 2번테이블 b
where 1번테이블.부서번호 = 2번테이블.부서번호

_______________________________________________

select a.이름, a.나이, b.연봉, b. 보너스
from 1번테이블 a, 2번테이블 b
where a.부서번호= b.부서번호

 

※ 등가조인  + where 조건

select a.이름, a.나이, b.연봉, b. 보너스
from 1번테이블 a, 2번테이블 b
where 1번테이블.부서번호 = 2번테이블.부서번호
	and 연봉 >= 4000;

 


2.  비등가조인  ( between A and B )

ex)

테이블 1번의 연봉을 ,

2번테이블의 최저열, 최고 열에 따라 조인           

연봉이 4000~ 8000사이라면 +  1등급 행이 조인이된다

테이블이름 : 1번테이블
사원번호 이름 부서번호 연봉 보너스
1 홍길동 101 5000 200
2 임꺽정 102 3500 500

 

테이블이름 : 2번테이블
등급 최저 최고
1 4000 8000
2 2800 4000

                                                   

select a.이름, a.나이, b.연봉, b. 보너스
from 1번테이블 a, 2번테이블 b
where 1번테이블.연봉 between 2번테이블.연봉(100만) and 2번테이블.연봉(500만)

3.  자체조인  ( 자기복사 )

ex)

테이블 이름 : 1번테이블
사원번호 이름 담당업무 상급자번호 연봉 보너스
1 홍길동 도적 4 4000 300
2 임꺽정 산적 2 5000 500
3 이순신 장군 3 8000 800
4 김두한 쌈꾼 1 3500 200

이런 표가 있을때 상급자의 정보는 번호만 나와있다

현재는 데이터가 몇개 없기에 바로 보이지만 50개이상만되더라도 잘구분이 안될것이다.

 

만약 아래와 같이 상급자의 정보를 불러오고 싶을때,  이럴때사용하면 좋다

 

사원번호 이름 담당업무 상급자번호
1 홍길동 도적 4
2 임꺽정 산적 2
3 이순신 장군 3
4 김두한 쌈꾼 1

 +

사원번호(상급자) 이름(상급자) 담당업무(상급자) 연봉(상급자) 보너스(상급자)
4 김두한 쌈꾼 3500 200
2 임꺽정 산적 5000 500
3 이순신 장군 8000 800
1 홍길동 도적 4000 300
select a.사원번호, a.이름, a.상급자번호, b.이름(상급자), b.연봉(상급자), b.보너스(상급자)
from 1번테이블 a, 1번테이블 b
where a.상급자 = b.사원번호

4.  외부조인 (+) where절에서 적용 ( 등가조인과 반대방식 ) 

등가조인은 특정열을 기준으로 일치하는것만 조회했다면, 

외부조인은 기준 1번테이블에 + 2번테이블 조인 , 단!!  연결되지 않는 데이터는 그대로 빈값(null)로 표시

 

사람마다 구별하는 방법이 다르다. 나는 (+)붙은쪽이 외부에서 굴러온놈이 찰싹 달라붙는다고 생각함

ex)

 

테이블 이름 : 1번테이블
사원번호 이름 담당업무 상급자번호 연봉 보너스
1 홍길동 도적 4 4000 300
2 임꺽정 산적 2 5000 500
3 이순신 장군 3 8000 800
4 김두한 쌈꾼 1 3500 200
5 오바마성님 전미국 대통령   9000 900
select a.사원번호, a.이름, a.상급자번호, b.이름(상급자), b.연봉(상급자), b.보너스(상급자)
from 1번테이블 a, 1번테이블 b
where a.상급자 = b.사원번호(+)

(+)를 a쪽에 붙여준다면 반대의 결과가 나온다.

 

조회결과~

외부조인결과
사원번호 이름 상급자번호 이름(상급자) 연봉(상급자) 보너스(상급자)
1 홍길동 4 김두한 3500 200
2 임꺽정 3 이순신 8000 800
3 이순신 1 홍길동 4000 300
4 김두한 2 임꺽정 5000 500
5 오바마성님 전미국대통령      

 


5.  Natural조인  ( 이름과 자료형이 같은열을 기준으로 등가조인 ) 

테이블명 :        1번테이블
사원번호 이름 부서번호
1 홍길동 101
2 임꺽정 102
테이블명 :           2번테이블
부서번호 내선번호 연봉 보너스 입사일
101 7854 5000 200 1988-11-15
102 6589 3500 500 1999-01-02

 

select a.사원번호, a.이름, 부서번호, b.내선번호, b.연봉, b.보너스, b.입사일
from 1번테이블 a nutural join 2번테이블 b

select의 기준열 명시와   from의 두 테이블 사이문구가 다르니 유의하자

 

 


6.  Join ~ Using조인  ( Using (기준열)명시하여 등가조인 ) 

select a.사원번호, a.이름, 부서번호, b.내선번호, b.연봉, b.보너스, b.입사일
from 1번테이블 a join 2번테이블 b using (부서번호)

7.  Join ~ on   ( on ( o.부서번호 = o.부서번호)명시 하여 조인 )

select a.사원번호, a.이름, 부서번호, b.내선번호, b.연봉, b.보너스, b.입사일
from 1번테이블 a join 2번테이블 b on (a.부서번호 = b.부서번호)

 


8.  왼쪽 , 오른쪽, 전체 외부조인  ( from 절에서 적용)

왼쪽외부조인 : 기준을 왼쪽에놓겟다.

( Left Outer Join )

select a.사원번호, a.이름, 부서번호, b.내선번호, b.연봉, b.보너스, b.입사일
from 1번테이블 a left outer join 2번테이블 b on (a.부서번호 = b.부서번호)

 

오른쪽외부조인 : 기준을 오른쪽에놓겟다.

( Right Outer Join )

select a.사원번호, a.이름, 부서번호, b.내선번호, b.연봉, b.보너스, b.입사일
from 1번테이블 a right outer join 2번테이블 b on (a.부서번호 = b.부서번호)

 

전체 외부조인 : 일치되는것들 조인, 안되는것들은 그대로표시 ( 모든데이터표시)

( full Outer Join )

select a.사원번호, a.이름, 부서번호, b.내선번호, b.연봉, b.보너스, b.입사일
from 1번테이블 a full outer join 2번테이블 b on (a.부서번호 = b.부서번호)

9.  3개이상의 테이블 조인시  ( from 절에서 적용)

 

select a.사원번호, a.이름, 부서번호, b.내선번호, b.연봉, b.보너스, b.입사일
from 1번테이블 a join 2번테이블 b on (a.부서번호 = b.부서번호)

select a.사원번호, a.이름, 부서번호, b.내선번호, b.연봉, b.보너스, b.입사일
from 1번테이블 a join 2번테이블 b on (a.부서번호 = b.부서번호)  
	join 3번테이블 c on(b.내선번호 = c.내선번호)

on (조건식) 이라고 보됨

 

 


 

 

※ 번외

 

단순하게 이렇게 작업진행시에는  첫번째 테이블 한행에,    두번째 테이블의 모든행들이 조합되어,

모든 경우의 수로 조합되어 2*2 =4 개의 행이만들어 지게됩니다. 이런결과를 원한다면 써도 좋을듯하다

보고 기억하기에는 아주 심플할듯 하다 ㅋㅋ (데카르트곱이발생된다고함)

select *
from 첫번째테이블, 두번째테이블

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts