요약 |
join 정의 두개 이상의 테이블 병합해 원하는 값 도출 |
일반조건 차이 join 조건은 없으면 오류가 난다. |
종류 non-equi,equi,natural,outer,self,cross join |
join 조건의 필요성 한테이블의 한행에 다른 테이블의 모든 행이 비교되는 것을 막음. |
self join 정의 같은 테이블 비교 테이블 명칭을 다르게 해주어 비교하기. |
outer join 정의 where 절 붙이고 싶은 테이블에(+) |
or |
from절 테이블명 left outer join 테이블명 |
or |
from절 테이블명 right outer join 테이블명 |
cross join 정의 from 테이블명 cross join 테이블명 |
natural join 정의 from 테이블명 natural join 테이블명 |
열의 이름만 같은경우 alter table 테이블명 |
rename column column명 to 바꾸는column명; |
를 한후에 |
select column명,column명 |
from table명 별칭 join table명 별칭 |
on (별칭.바꾼column명=별칭.기존 column명) |
|
|
join조건이란 ? |
두개 혹은 그 이상의 테이블을 병합에 특정 조건에 대한 계산을 통해 원하는 값을 도출해 내는 것. |
----------------------------------------------------------------------------------------------------------------------- |
join조건과 일반 조건의 차이? |
일반조건은 없어도 값을 도출 하지만 join조건은 없으면 오류가 나온다. |
----------------------------------------------------------------------------------------------------------------------- |
종류 ? |
equi-join |
non equi-join |
self-join |
outer-join |
natural-join |
cross join |
응용 (99년도 표준안 개정된 것들- 기존 버전에 익숙한 개발자들과 협업을 위해 92년도 명령어도 숙지하고 있어야한다.) |
join ~~ using |
join ~~ on |
left outer join <- 각 join에 있다. |
right outer join |
full outer join |
---------------------------------------------------------------------------------------------------------------------- |
*join조건의 필요성 |
select ename,dname |
2 from emp,dept 를 하게 되면 예상보다 상당히 많은 수의 행이 나오게 되는데 |
cartesian product 때문이다. cartesian product란 !(factory)처럼 한가지 수에 반대편에 대한 모든 수를 계산하게 되는 것이다 . |
즉 emp의 1절*dept의 1절 /2절/3절/4절... 등이 계산되어 나오게 된다. |
그래서 where절로 알맞는 조건을 걸어주어 원하는 결론을 도출해 내어야만 하는데 |
|
emp table과 dept table의 요소중 공통 분모인 deptno에 대해서 조건을 걸어주게 되면 |
|
|
|
SQL> select ename,dname |
2 from emp,dept |
3 where emp.deptno=dept.deptno; <- 두개 이상의 테이블을 연결하며 올바른 연결을 위해 =를 이용해 테이블을 연결하는 것을 equi-join 조건이라 한다. |
|
ENAME DNAME |
---------- -------------- |
CLARK ACCOUNTING |
KING ACCOUNTING |
MILLER ACCOUNTING |
JONES RESEARCH |
FORD RESEARCH |
ADAMS RESEARCH |
SMITH RESEARCH |
SCOTT RESEARCH <- 원하는 값을 얻을 수 있다. |
WARD SALES |
TURNER SALES |
ALLEN SALES |
|
ENAME DNAME |
---------- -------------- |
JAMES SALES |
BLAKE SALES |
MARTIN SALES |
|
|
*Join하고자 하는 두 테이블에 공통된 요소가 있는경우 |
SQL> select ename,deptno,dname |
2 from emp,dept |
3 where emp.deptno=dept.deptno; |
select ename,deptno,dname |
* |
1행에 오류: |
ORA-00918: 열의 정의가 애매합니다 <-에러가 뜨는이유는 테이블 둘다 deptno가 있기 때문에 어디에 있는 누구인지 잘 모르게 된다 . |
table명.column명으로 정의를 해야한다. |
|
|
1 select ename,emp.deptno,dname |
2 from emp ,dept |
3* where emp.deptno=dept.deptno |
|
|
* 테이블 이름이 긴 경우에 동일하게 별칭을 넣을 수가 있다. |
---------------------------------------------------------------------------------------------------------------------------- |
*join 조건의 일반화 |
n개의 표를 비교해 원하는 값을 출력하려면 조인조건은 |
2 3 ... n 표 |
1 2 ...n-1 개가 필요하다 . |
ex) 사원명 부서명 급여등급을 나란히 출력하고 싶다면? |
세개의 표 a b c 에서 ab를 묶는조건 ac를 묶는 조건을 연결하면 된다. |
select e.ename,d.dname,s.grade |
from emp e, dept d , salgrade s |
where e.deptno=d.deptno and e.sal between s.losal and s.hisal이 되는데 |
s.local과 s.hisal과 e.sal를 연결하는것에 대해서 필요가 없을 수도 있지만 트래픽 측면에서 둘의 관계를 명시해주어야 효율적이된다. |
---------------------------------------------------------------------------------------------------------------------------- |
self join이란? |
where절은 테이블 내에서 항상 같은 row 단위로 보기 때문에 row가 다르면 비교를 할 수가 없다 . |
select* |
from emp |
where mgr=empno;가 안되는 이유이기도 하다. |
|
논리적 명령어로 복사한셈 치고 계산해야 한다. |
select e.ename,c.ename |
from emp e, emp c <- table에 다른 별칭을 준다. |
where e.mgr=c.empno; |
----------------------------------------------------------------------------------------------------------------------------- |
outer join 이란? |
where 절 붙이고 싶은 테이블에(+) |
or |
from절 테이블명 left outer join 테이블명 |
or |
from절 테이블명 right outer join 테이블명 |
특정 주어진 table 내에서 null이 있는 것을 기존의 self join된 결과에 아래쪽에 더해서 그냥 붙이는 조인을 outer join이라 한다. |
select e.ename,c.ename |
2 from emp e,emp c |
3 where e.mgr=c.empno(+) <- (+)를 붙여준다. 상사쪽 결과에 null이 있기 때문에. |
ENAME ENAME |
---------- ---------- |
FORD JONES |
SCOTT JONES |
JAMES BLAKE |
TURNER BLAKE |
MARTIN BLAKE |
WARD BLAKE |
ALLEN BLAKE |
MILLER CLARK |
ADAMS SCOTT |
CLARK KING |
BLAKE KING |
|
ENAME ENAME |
---------- ---------- |
JONES KING |
SMITH FORD |
KING <- null이 붙은 상태 |
|
|
outer join은 실무에서 많이 쓰인다. |
select e.ename,c.ename |
2 from emp e left outer join emp c <-left는 데이터를 왼쪽에 붙인다는 명령 |
3 on (e.mgr = c.empno); |
|
|
----------------------------------------------------------------------------------------------------------------------------- |
cross join이란? |
가능한 모든 조합을 생성해 낸다. |
from 테이블명 cross join 테이블명 |
SQL> SELECT E.ENAME,D.DNAME = SELECT E.ENAME, D.DNAME |
2 FROM EMP E,DEPT D; FROM EMP E CROSS JOIN DEPT D; |
----------------------------------------------------------------------------------------------------------------------------- |
natural join이란? |
from 테이블명 natural join 테이블명 |
두개의 테이블에서 같은 열인것을찾아 그것을 중심으로 하나로 만들어준다. |
*만약 SELECT에 두 테이블의 공통열인 DEPTNO를 보려고한다면 특정 테이블의 DEPTNO라는것을 |
표시하면 안된다. NATURAL JOIN이 공통으로 하기 때문에 . |
|
|
SELECT E.ENAME, D.DNAME = SELECT E.ENAME, D.DNAME |
FROM EMP E,DEPT D FROM EMP E NATURAL JOIN DEPT D; |
WHERE E.DEPTNO=D.DEPTNO; |
만약 natural join에서 공통된 column이 두개이상이라면? |
|
select e.ename,d.dname |
from emp e join dept d |
using (deptno);를 해준다 |
*using(공통된 열중 겹치고싶은 열) |
|
------------------------------------------------------------------------------------------------------------------------ |
*만약 안에 들어있는 데이터는 동일한데 열의 이름만 다른경우 |
그러한 조건을 만들어 주기위해 테이블의 이름을 바꾸는 코드 |
alter table emp |
rename column deptno to dno;를 한후에 |
|
|
select e.ename,d.dname |
from emp e join dept d |
on (e.dno=d.deptno); <-같다는 명령어를 해주면 똑같이 실행된다. |