ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JOIN조건
    Oracle-diary/QUERY 2020. 1. 30. 17:51
    요약
    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); <-같다는 명령어를 해주면 똑같이 실행된다.

    'Oracle-diary > QUERY' 카테고리의 다른 글

    TABLE,RDBMS,사용자종류  (0) 2020.01.30
    SUBQUERY  (0) 2020.01.30
    DESC,절과 문,기본 명령어  (0) 2020.01.30
    BUFFER  (0) 2020.01.30
    AND와 OR,BOOLEAN  (0) 2020.01.30

    댓글

Designed by Tistory.