본문 바로가기

JAVA/Oracle

오라클 - join 에 대한 설명 및 예제

반응형

** join

검색하고자 하는 데이터가 두 개이상의 테이블에 나누어져 있을 때 

사용하는 sql 명령어의 형식 


==> 그렇다면 왜 골치 아프게 데이터를 하나의 테이블에 넣지 않고 여기,저기 분리해서 넣었을까요?

왜 여러개의 테이블의 분리하여 데이터를 넣을까요?


하나의 테이블에 모든 데이터를 저장하다보면 발생하는 문제가 있을 것이다.

==> '무정규화 상태' 라고함

==> 데이터 중복!, 데이터의 불일치!

==> '이상현상' 발생할 수도 있다

데이터를 삽입할 때 '삽입이상'

데이터를 갱신할 때 '갱신이상'

데이터를 삭제할 때 '삭제이상'



** join


==> 형식)

select 칼럼명1, 칼럼명2, ... from 테이블명1, 테이블명2, 테이블명3,.........

where 조건식;

(관계가 있을 경우에 한번에 검색할 수 있다)

(where에는 두개의 테이블에 공동으로 들어가는 칼럼을 써준다.)

형태)

테이블명1.공동칼럼 = 테이블명2.공동칼럼

테이블명1.참조값 = 테이블명2. 주식별자


예)  

두 테이블에 나눠져 있는 정보를 

모든 사원의 이름, 입사일, 부서명, 부서위치를 출력하고 싶을때

select ename, ehiredate, dname, dloc from emp, dept 

where emp.dno = dept.dno;


예2)

두 테이블에 나눠져 있는 정보를 

모든 사원의 이름, 입사일, 부서번호, 부서명, 부서위치를 출력하고 싶을때


select ename, ehiredate, dno, dname, dloc from emp, dept 

where emp.dno = dept.dno;


에러메세지)

ORA=00918 : 열의 정의가 애매합니다 


==> dno라는 칼럼은 dept에도 있고 emp에도 있어서 오류가 발생


해결방법

==> 두테이블 중 아무거나 정의 해주면됨

select ename, ehiredate, dept.dno, dname, dloc from emp, dept 

where emp.dno = dept.dno;


or


select ename, ehiredate, emp.dno, dname, dloc from emp, dept 

where emp.dno = dept.dno;


join 연습)

서울에 근무하고 근무개월수가 3개월 이상인 모든 근로자의

이름, 부서번호, 부서명, 근무개월수, 입사일을 출력하시오.

단 입사일은 다음과 같이 출력합니다. "2015/02/15 목"


select ename, dept.dno, dname, 

round(months_between(sysdate, ehiredate)) month, 

to_char(ehiredate, 'yyyy/mm/dd dy') hiredate 

from emp, dept 

where emp.dno = dept.dno

and dloc like '%서울%'

and round(months_between(sysdate, ehiredate)) >= 3 ;


join 연습2)

개발팀에 근무하는 35세이상인 사원들의 동호회를 만들고자 한다.

대상자들에게 우편물을 보내고자 한다. 해당근로자의

사원명, 근무지주소, 나이, 입사일, 부서명을 출력합니다.

단, 근무지 주소 순으로 출력하되 동일할 때는 사원명순으로 출력한다.


select ename, dloc, (substr(sysdate,1,2)+100) - substr(ejumin, 1, 2) age, ehiredate

from emp, dept

where emp.dno = dept.dno

and dname like '%개발%'

and (substr(sysdate,1,2)+100) - substr(ejumin, 1, 2) >= 35

order by dloc, ename;




** 밑에 처럼 join을 할 때 클래스명에 애칭을 줄수도 있다.


select ename, ehiredate, emp.dno, dname, dloc from emp, dept 

where emp.dno = dept.dno;


select ename, ehiredate, d.dnodname, dloc from emp e, dept d

where e.dno = d.dno;

반응형