ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ SQL ] JOIN 의 종류
    Database/SQL (oracle, mysql) 2019. 5. 27. 17:51

    JOIN

    - 한개 이상의 테이블에서 데이터를 조회하기 위해 사용한다.

    - 두개 이상의 테이블을 참조해서 데이터를 검색한다.

    - FROM 뒤에 두개 이상의 테이블을 명시한다.

    크로스 조인(곱)과 , EQUI조인 두가지가 있다.

     

    CROSS JOIN

    특정 조건을 주지 않는다면 CROSS JOIN의 형태가 출력된다.

    (2행 3열) + (3행 2열) = 6행 5열

    ex. SELECT ENAME, DNAME FROM EMP, DEPT;

    ex. SELECT ENAME, EMP.DEPTNO FROM EMP, DEPT;

         ( DEPTNO은 EMP, DEPT 테이블에서 같이 갖고 있기 때문에 꼭 어느 테이블의 DEPTNO인지 표시해 줘야 한다.)

         ( 그렇지 않다면 에러가 난다. ambiguously defind -- 애매모호하다라는 에러 )

     

    EQUI JOIN
    ex. SELECT ENAME, EMP.DEPTNO FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

         ( 조건을 걸어서 1대1 매핑이 가능하다.)

    ex. SELECT ENAME, EMP.DEPTNO, DNAME, LOC FROM EMP, DEPT 

         WHERE ENAME='SCOTT' AND EMP.DEPTNO=DEPT.DEPTNO;

     

    Non-Equi JOIN

    ex. FROM EMP, SALGRADE WHERE EMP.SAL BETWEEN SALGRADE.LOSAL AND SALGRADE.HISAL;

    특정 범위 내에 있는 값을 조회시 사용

    문제) 각 사원의 정보를 출력하는데 사원번호, 사원명, 급여, 급여등급을 출력하시오

     

    SELF JOIN

    ex.  SELECT  E1.EMPNO "사원명", E1.ENAME "직속상사명", E1.SAL, E2.ENAME FROM EMP E1, EMP E2 

    WHERE E1.MGR=E2.EMPNO AND E1.ENAME='SCOTT';

    하나의 테이블이 마치 두개인 것처럼 자기 테이블과 조인하는것

    같은 행에 원하는 데이터가 없을때 셀프 조인을 사용한다.

    SCOTT 사원의 MANAGER 사원코드로 MANAGER이름을 출력하겠다.

    FROM 테이블1, 테이블1 에 각각 별칭을 꼭! 써줘야 한다. 왜? 동일한 테이블 명이 두개 들어가니까

     

    OUTER JOIN

    ( 아싸 -> 인싸로)

    ex. SELECT E1.ENAME, E2.ENAME FROM EMP E1, EMP E2 WHERE E1.MGR= E2.EMPNO(+);

    * null은 비교, 연산, 할당 불가

    * 해결: null이 포함된곳에 (+) 를 붙여준다.

    테이블 조인 중 한쪽 테이블에 존재하지 않는 데이터로 인해서 출력되지 않는 행을 출력하고 싶을 때 사용.

    '(+)' 기호를 사용하여 OUTER JOIN인지를 판별한다.

    값이 NULL이면 연산이 불가하기 때문에 NULL처리를 해줘야 한다.

    밖으로 빠진 NULL데이터를 다시 내부로 가져 오기 위한 조인이 OUTER JOIN이다.

    NULL값이 포함된 테이블에 (+)를 해준다.

    결과에서 빠진 결과를 추가해준다.


    ANSI 조인 (, 가 없으면 ANSI) <- 9i부터

    ** DBMS 종류와 상관없이 실행된다.

    FROM 테이블1, 테이블2 <-콤마를 제거하고 컬럼명만 적어야 한다.

     

    1. CROSS JOIN 표현시

    SELECT EMPNO, ENAME, DNAME 

    FROM EMP CROSS JOIN DEPT; ( ' , ' 대신 CROSS JOIN 사용)

    ANSI JOIN을 사용하는 이유는 MY SQL, MARIA DB 등 모든곳에 동일하게 JOIN을 사용하기 위함이다.

     

    2. INNER JOIN 표현시

    - ON + 공통칼럼(동등조건식) ( WHERE은 써도 안써도 된다.)         

    SELECT EMPNO, ENAME, DNAME FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO 

    WHERE ENAME='JAMES';                                                            (= USING (DEPTNO))

     

    3. INNER JOIN을 USING절 사용하기

    ※USING절 사용시 공통된 컬럼에 대해 emp.deptno 또는 dept.deptno 사용 불가!!
                              ---> 특정 테이블이 아닌 USING절에서 정의한 deptno컬럼명만 사용!!
     select empno, ename, emp.deptno, dname   -- 에러발생
     from   emp inner join dept
     USING  (deptno);
     

    SELECT EMPNO, ENAME, DNAME
    FROM EMP INNER JOIN DEPT

    USING (DEPTNO) WHERE ENAME='JMES'

     

    4. ​NATURAL JOIN 사용하기

    SELECT EMPNO, ENAME, DNAME FROM EMP NATURAL JOIN DEPT

    두 테이블이 갖는 컬럼중 공통된 이름의 컬럼을 자동으로 동등조건 해준다. 이름기준으로 묶어줌

     

    5. ANSI OUTER JOIN

    SELECT ENAME, DEPT.DEPTNO, DNAME, LOC 

    FROM EMP RIGHT OUTER JOIN DEPT

    ON DMP.DEPTNO = DEPT.DEPTNO  <--  using (deptno); 로 변경가능하다.

    -- 왼쪽 컬럼에 조인시킬 값이 없는 경우에 RIGHT OUTER JOIN을 해준다.

     

    FROM 테이블명1 ( LEFT | RIGHT | FULL ) OUTER JOIN 테이블명 2 <- 조건절은 ON

    원인 제공쪽에 방향 표시를 한다.

    문제) 각 사원의 이름과 부서번호, 부서명, 부서위치를 출력하시오. 
          (14명 사원이 속하지 않은 40번 부서에 대해서 출력)

     

    반응형

    댓글

Designed by Tistory.