JOIN
여러테이블에 흩어져 있는 정보 중에서 사용자가 필요한 정보만 가져와서 가상의 테이블 처럼 만들어서 결과를 보여준다.
: 관계형 데이터 베이스는 두개 이상의 테이블에 정보가 나누어져 있다.
중복해서 데이터를 저장하는 것을 지양하기 때문이다.
각각의 테이블에 분리 되어 있는 연관성 있는 데이터들을 연결하거나 조합하여 데이터를 사용 할 수 있다면
중요한 정보로서 가공될 수 있으며 이런 작업들을 JOIN 이라고 한다.
여러테이블에 흩어져 있는 정보 중에서 사용자가 필요한 정보만 가져와서 가상의 테이블 처럼 만들어서 결과를 보여준다.
종류 | 의미 |
Equl Join | 동일 컬럼을 기준으로 조인 |
Non_Equl Join | 동일 컬럼이 없이 다른 조건을 사용하여 조인 |
Outer Join | 조인 조건에 만족하지 않은 로우도 나타냄 |
Self Join | 한 테이블 내의 조인 |
Cross Join =(Cartesian Product : 카티션 곱) | 2개 이상의 테이블이 조인 될 때 where절에 의해 공통되는 컬럼에 의한 결합이 발생하지 않는 경우의 의미 (사용하지 않음) |
Equal Join
(예) 'DALLAS'에서 근무하는 사원의 이름과 직급과 월급과 근무지를 출력하는 쿼리문을 작성하시오
>> select deptno from dept where LOC ='DALLAS';
select ename, job, sal from emp where deptno=20;
위와같이 두세번 쿼리를 작성 할수도 있지만 아래와 같이 Equl join 을 이용 할 수도 있다.
>> select e.ename, e.job,e.sal ,d.loc from emp e, dept d where e.deptno=d.deptno and d.loc ='DALLAS';
emp e : 별칭을 부여한 것이다. 별칭을 부여하지 않으면 emp.ename 이런식으로 적어주면 된다.
만약 한쪽 테이블에만 존재하는 유일한 컬럼이라면 e. 을 안 붙여도 된다.
이때 e.deptno = d.deptno 로 같은것을 찾아가는데 이것이 이퀄조인이다.
Q) 'RESEARCH' 부서에서 근무하는 사원들의 이름, 입사일, 월급, 근무지, 근무부서명을 출력하는 쿼리문을 작성하시오
>> select e.ename,e.hiredate,e.sal,d.loc,d.dname from emp e, dept d
where d.dname='RESEARCH' and e.deptno = d.deptno;
Q) 직급이 메니저인 사원의 이름, 월급, 근무지를 출력하는 쿼리문 작성
>> select e.ename,e.sal, d.loc from emp e, dept d where e.job ='MANAGER' and e.deptno = d.deptno;
e.deptno = d.deptno; 를 사용하는 이유 !
사용했을때 | 안했을때 |
![]() |
![]() |
해주지 않으면 d테이블과 e 테이블이 따로 논다고 생각하면 된다. e에 해당하는 애들을 쭉 ~ 출력하는데 d에 해당하는 4개도 출력해야한다. 이때 기준이 따로 없네?? 그러면 다 출력해야지 하면서 d를 4번다 출력하려고 하므로 경우에수를 모두 표현하기 위해 다음 그림과 같이 표현이 된다. |
Q) 'ACCOUNTING' 부서 소속 사원들의 이름과 입사일과 근무지를 출력
>> select e.ename, e.hiredate,d.loc from emp e , dept d where d.dname='ACCOUNTING' and d.deptno = e.deptno;
Non_Equal Join
동일 컬럼 없이 다른 조건을 사용하여 조인할때 쓰인다.
조인 조건이 특정 범위 내에 있는지 조사하기 위해 where 절의 조인 조건으로 = 연산자와 비교연산자를 사용한다.
Equal Join - jion 조건에 서로다른 조건(=)를 가진 데이터를 join 해서 가져오는 방법
Non_Equal Join - 같은 조건이 아닌 크거나 작거나 하는 경우 join을 수행하는 방법
Q) 각 사원의 급여가 몇 등급인지 살펴보는 쿼리문 작성
>> select ename, sal, grade from emp,salgrade where sal between losal and hisal;
(여기서도 각 컬럼이 유일하지 않으면 테이블의 별칭을 적어주어야 한다. 예 - e.ename )
[해석]
select ename, sal, grade / from emp,salgrade / where sal between losal and hisal;
ename,sal,grade를 보여줄게/ emp,salgrade에서가져와서 / losal<sal <hisal sal을 저 범위안에 넣어서 grade판정함
Q)emp테이블의 한명의 사원 이름과 소속 부서명(dept), 급여의 등급(salgrade)을 출력하는 쿼리문
(사원테이블에는 부서 이름과 급여등급은 없고, 부서 번호와 급여만 있다.)
>> select e.ename, d.dname,s.grade from emp e, dept d , salgrade s
where d.deptno=e.deptno and e.sal between losal and hisal;
where sal between losal and hisal; 대신에
where e.sal >= s.losal and e.sal <= s.hisal;
라고 사용가능
ANSI SQL 특징
DBMS들에서 각기 다른 SQL을 사용하므로, 미국 표준 협회에서 이를 표준화 하여 표준 SQL을 정립시켜 놓은 것이다.
표준 SQL문이기 때문에 DBMS의 종류에 제약을 받지 않는다. (MYSQL,Oracle ....)
즉, 특정 벤더에 종속적이지 않아 다른 벤더의 DBMS로 교체하더라도 빠르게 다른 벤더사를 이동 할 수 있다.
특정 DBMS의 이탈이 가속되는 것도 ANSI SQL의 영향이 크다고 할 수 있다.
테이블 간의 JOIN 관계가 FROM에서 명시되기 때문에 WHERE문에서 조건만 확인하면된다.
즉, 가독성이 일반 쿼리문 보다 좋다.
[ANSI Syntax 방법 ]
>> select ename,job,sal,grade from emp join salgrade on sal between losal and hisal;
SELF Join
: 조인은 서로 다른 두개 이상의 테이블을 연결하기도 하지만 하나의 테이블 내에서 조인을 해야만 자료를 얻는 경우도 있다. 셀프조인은 자기자신과 조인하는 경우이다.
(예) 상관이 'KING'인 사원들의 이름과 직급을 출력하시오
>> select e.ename, e.job,e.mgr from emp e ,emp dd where dd.empno = e.mgr and dd.ename ='KING' ;
Q) JONES와 동일한 근무지에서 근무하는 사원 이름, 월급, 근무지를 출력하시오 .단 JONES는 제외하시오.
>> select f.ename f.sal, d.loc from emp e,emp f, dept d where e.deptno = d.deptno and e.deptno=f.deptno and e.ename='JONES' and f.ename <> 'JONES';
>>select f.ename, f.sal, d.loc from emp e, emp f ,dept d where f.deptno= d.deptno and e.deptno = f.deptno and e.ename = 'JONES' and f.ename <> 'JONES';
Q) 이름인 'SMITH'인 사원의 매니저 이름을 출력하시오.
>> select e.ename from emp e, emp f where e.empno = f.mgr and f.ename='SMITH';
(나의 상관번호와 그사람의 사원 번호가 동일하면 된다. 여기서 select로 보여주고 있는 e는 그사람의 것이다. 즉 그사람의 사원번호 e.empno 와 나의 상관번호가 같아야한다 f.mgr이 같아야 하고 나의것이므로 f.ename ='SMITH'로 준다.)
>>select e.ename || '의 매니저는' ||m.ename ||'입니다.' from emp e, emp m
where e.mgr = m.empno and e.ename ='SMITH' ;
Q) emp테이블의 사원들의 이름과 상관이름을 출력하시오.
>> select e.ename as 사원 , f.ename as 상관 from emp e, emp f where e.mgr = f.empno ;
KING은 mgr이 null 이므로 빠졋다.
OUTER Join
: 2개 이상의 테이블이 조인 될때 어느 한쪽 테이블에는 해당 하는데이터가 존재하지 않는데 다른 쪽의 테이블에는 존재하는 경우 그 데이터는 출력되지 않는 문제를 해결하기 위해 사용되는 조인기법이다.
(예를들어 한쪽에는 사원이 1- 50 까지 있고 한쪽은 1-10 까지 있을때 한쪽에는 없는 11-50 까지도 출력하고자할때 이용)
: 필요시 꼭 써야 하는 outer join 이지만 필요 없을땐 쓰지 않아야한다.
outer join은 모든 데이터를 다 가지고 올때 full scan을 하기 때문에 DB에 무리를 가할 수 있기 때문이다.
(예) select e.ename, d.deptno, d.dname
from emp e , dept d
where e.deptno = d.deptno
order by d.deptno;
>> select e.ename, d.deptno, d.dname
from emp e , dept d
where e,deptno(+) = d.deptno; >> 없는 쪽에 (+) 표시를 한다.
>> select e.ename as 사원 , f.ename as 상관 from emp e, emp f where e.mgr = f.empno(+) ;
//매니져가 없는 사원 번호에 + 를 해서 null도 나오도록 해줌
//없는쪽에 +를 해준다. e는 사원을 뽑아낼 공간이다. (14명) ,f는 상관을 뽑아낼 공간인데 king은 상관이
//없음으로 (13명) 이다. 즉 f가 값이 더 작다. 그러므로 (+)를 해줘서 없는 값 까지 뽑아내 준다.
만약 반대로 e.mgr(+) = f.empno 라고 준다면 사원을 +해 줌으로써 나머지 상관 테이블의 것들이 다 나오게 된다.
즉 내 밑에 사원이 없더라도 상관테이블에 이름이 나오게 됨. 즉 모든 사람들의 이름이 출력된다.(상관테이블에서)
Q) 사원이름에 'T' 가 들어가는 사원들의 이름과 부서명을 출력하시오
>> select e.ename , d.dname from emp e ,dept d where e.deptno = d.deptno and e.ename like (%T%);
[ANSI Syntax 방법 ]
>> select e.ename, d.dname from emp e NATURAL JOIN dept d where e.ename like '%T%' ;
Q) 사원 이름, 직급, 급여, 급여 등급을 출력하시오
>> select e.ename, e.job, s.grade from emp e, salgrade s where e.sal between losal and hisal ;
>>select e.ename, e.job, s.grade from emp e, salgrade s where e.sal>=s.losal and e.sal <= s.hisal;
Q) 'DALLAS'에서 근무하는 사원들의 이름, 직급, 부서번호, 부서이름을 출력하시오
>> select e.ename, e.job, e.deptno, d.dname from emp e, dept d where e.deptno = d.deptno and d.loc='DALLAS';
[ANSI Syntax 방법 ]
>> select e.ename, e.job, e.deptno, d.dname from emp e NATURAL JOIN dept d where d.loc='DALLAS';
Q) 'SMITH'의 사원이름, 부서번호와 'SMITH'와 같은 부서에서 근무하고 있는 사원의 이름 출럭
(해당 사원과 같은 부서에 있는 사원들을 동료 라고 표시하시오 )
>> select e.ename, e.deptno , f.ename as 동료 from emp e, emp f
where e.deptno =f.deptno and e.ename='SMITH' and f.ename<>'SMITH';
'KH > Oracle' 카테고리의 다른 글
# 13 DDL -CREATE,DROP,RENAME,ALTER,TRUNCATE , ROWID (0) | 2022.08.30 |
---|---|
# 12 SUB QUERY(서브 쿼리) , ROWNUM (0) | 2022.08.29 |
# 10 그룹 함수 (0) | 2022.08.26 |
# 9 NULL , 음수표시(PR),DECODE,CASE (0) | 2022.08.25 |
# 8 형 변환 함수 (0) | 2022.08.25 |