ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL - 조인
    DataBase/Oracle 2023. 8. 30. 17:27

    1. 조인 

     

     - 집합연산자와 차이점: 집합 연산자는 SELECT의 결과를 세로로 연결한 것, 조인은 두 개 이상의 테이블을 가로로 연결

     - 여러 테이블을 사용할 때 from절: - FROM절에는 여러 테이블을 지정하는 것이 가능하다 .(,로구분) (크로스조인, 카테시안곱)

                                                     - 정확히는 열과 행으로 구성된 데이터 집합이면, 모두 FROM절에 지정가능(뷰,시퀀스)

     - 조인 조건이 없는 경우 문제점: - 결과로 나올 수 있는 모든 행을 조합함 ( A: 1,2 행 B: 1,2 행 > (11,12,21,22) )  

                                                        -  따라서 정확한 데이터 함께 출력됨 

                                                        - 조인할 테이블이 많아질 수록 정확한 데이터 뽑아내기 위해 고민을 많이 하자

                                                           (WHERE가 많은 역할을 해준다!)

    --크로스 조인 where 조건절 
    
    SELECT * FROM EMP,DEPT
    WHERE EMP.DEPTNO = DEPT.DEPTNO
    ORDER BY EMPNO;

      - 테이블 별칭 설정 : SELECT처럼 FROM에도 테이블별로 별칭 설정이 가능하다.

     

    2. 조인의 종류

     

    2.1 등가조인 (내부조인, 단순내부조인)

     

       - 일반적으로 가장 많이 사용됨, default 조인방식

       - 특정 열값이 일치한 출력 결과를 사용하는 방식 

     

    SELECT E.EMPNO, E.ENAME, E.SAL, D.DEPTNO, D.DNAME, D.LOC
    FROM EMP E, DEPT D
    WHERE E.DEPTNO = D.DEPTNO
    AND SAL >= 3000;

      - 위와 같이 AND를 사용하여 여러 조건을 추가로 달아서 출력범위를 설정할 수 있다.

      - 필수 필요 조건식의 수는 데이블 개수에서 하나 뺀 값이다. (A,B,C가 있다면 , (A=B)=C가 가능하도록 2개 필요)

        *여러 테이블에서 열이름이 같으면, 테이블명 혹은 테이블 별칭을 적어주자 

     

    2.1.1 비등가조인

     

     - 등가조인 외의 방법을 의미 

     - EMP 테이블과 SALGRADE 테이블을 조합한다고 했을 때 두 테이블에 일치하는 열 x(등가조인x)

     - EMP테이블의 SAL열은 SALGRADE테이블의 LOSAL과 HISAL 사이에 위치 이때 BETWEEN연산자로 처리가능

    SELECT * FROM EMP E, SALGRADE S
    WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

      *등가조인에 비해 자주 사용되는 방식은 아니다.

       (WHERE 사용하지 않고, FROM으로 불러오면 데카르트곱 -> 각 사원별 5개 등급이 모두 나옴)

       

     

    2.1.2 자체조인

     

     - 한 테이블을 연속으로 붙여둔다고 보자 

     - EMP 테이블에 MGR열(직속 상관 사원번호)이 열과 나머지 사원 정보가 나란히 출력해야하는 경우 

     - MGR열과 EMPNO열 값을 연결 (특정 MRG열과 일치한 EMPNO열 일치시켜야함)

    SELECT * FROM MEP E, COPY_EMP C WHERE E.MGR = C.EMPNO;

     - EMP테이블과 일치한 COPY가 있다면 위와 같이 해결할 수 있는데, 이는 비효율적(데이터 아깝고, 갱신 어려움)

     - 이를 해결하기 위한 방법이 self join임 

    SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MRG_EMPNO, E2.ENAME AS MGR_NAME
    FROM EMP E1, EMP E2 
    WHERE E1.MGR = E2.EMPNO;

     - 같은 테이블이지만, 다른 별칭을 사용하여 논리적으로 다른 테이블처럼 사용

     

    *MGR열이 NULL인 KING은 제외 -> 이는 일치한 열을 기준으로 데이터가 조인되고 추출되기 때문이다.

     (내부조인, 등가조인과 비슷하다)

     

     2.2 외부조인 

     

     - 내부조인의 문제점은 일치한 열을 기준으로 결과가 나오므로, 일치하지 않거나, 해당 열이 NULL인 경우에

       결과가 출력되지 않는 점이 있다.

     - 일치하지 않는 경우에도 결과에 포함하고 싶을 때는 외부조인을 사용하자 

    Left Outer Join  WHERE TABLE1.COL1 = TABLE2.COL1(+)
    Right Outer Join  WHERE TABLE1.COL1(+) = TABLE2.COL1
    --1
    SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MRG_EMPNO, E2.ENAME AS MGR_ENAME
    FROM EMP E1, EMP E2
    WHERE E1.MGR = E2.EMPNO(+)
    ORDER BY E1.EMPNO;
    --2
    SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MRG_EMPNO, E2.ENAME AS MGR_ENAME
    FROM EMP E1, EMP E2
    WHERE E1.MGR(+) = E2.EMPNO
    ORDER BY E1.EMPNO;

     - 1은 LEFT OUTER JOIN임 왼쪽열을 기준(최소 모든 데이터 출력) 조인되는 테이블 열은 일치하는 값만 출력

     - 2는 RIGHT OUTHER JOIN 오른쪽열 데이터는 모두 출력 조인되는 테이블열은 일치하는 값만 출력 

       -> 일치하는 값이 없다면 그냥 null처리 

     

    * 원하는 결과로 join하기 위해 +를 바꿔가며 연습해봅시다. 

    * FULL OUTER JOIN은 각 OUTER조인 SELECT한 결과 UNION합시다.

     

    3. SQL-99 표준 문법 조인 

     

    3.1 NATURAL JOIN

          

      - 등가조인 (내부조인) 

     

    > NATUAL JOIN

    SELECT E.EMPNO, DEPTNO, D.DNAME --
    FROM EMP E NATIAL JOIN DEPT D;

     - EMP와 DEPT에 공통열을 기준으로 알아서 내부조인 해줌 (FROM에 조인 묘사)

     - 이때 기준이 되는 열은 테이블명을 붙이면 안됨!!

     

     > JOIN ~ USING

    FROM TABLE JOIN TABLE2 USING('조인에 사용할 기준열')

       - 이와 같이 작성가능  WHERE절에 또 다른 조건식 추가하여 함께 사용가능 (JOIN 후에 WHERE 작동)

       - NATUAL과 마찬가지로 기준이 되는 열에 테이블명 사용 금지 

     

     > JOIN ~ ON 

    FROM TABLE1 JOIN TABLE2 ON(조인조건)

      - 가장 범용성 있는 JOIN ~ ON 조인조건을 ON에 명시 그 밖에 추가기준 WHERE에 명시 

      - OUTHER JOIN도 JOIN ~ ON과 비슷한 형태 

    FROM TABLE1 LEFT OUTER JOIN TABLE2 ON()
    -- WHERE TABLE1.COL = TABLE2.COL(+)
    FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON()
    -- WHERE TABLE1.COL(+) = TABLE2.COL
    FROM TABLE1 FULL OUTHER JOIN TABLE2 ON()
    -- 오라클에는 없음 걸러낸다음 유니온

    'DataBase > Oracle' 카테고리의 다른 글

    오라클 - 객체 종류  (0) 2023.08.31
    SQL - 서브쿼리  (0) 2023.08.31
    SQL - 다중행 함수  (0) 2023.08.30
    오라클 SQL - 단일행함수  (0) 2023.08.30
    2. SQL - 조회  (0) 2023.08.29
Designed by Tistory.