조인이란 ?
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 첫번째테이블, 두번째테이블
'오라클' 카테고리의 다른 글
오라클 조인결과 스프링을 통하여 출력하기 (0) | 2023.01.19 |
---|---|
오라클 원격저장소변경 (2) | 2023.01.18 |
오라클 명령어 ( 단순 추가,변경,삭제,조회, 제약조건) (0) | 2023.01.16 |