Oracle DataBase

SELECT - JOIN

  • ANSI 표준
    • USING EXPR
      • PK와 FK 사이의 COLUMN들을 기준으로 JOIN할 때 사용한다.
    • ON EXPR
      • 서로 다른 이름의 COLUMN을 기준으로 JOIN할 때 사용한다.
    • LEFT / RIGHT / FULL
      • JOIN 명령어를 기준으로 LEFT는 왼쪽 테이블, RIGHT는 오른쪽 테이블
    • NATURAL JOIN
      • 자식의 일반 COLUMN 중 부모의 기본키와 같은 이름의 COLUMN을 잡아서 JOIN을 하는 JOIN
      • 외래키가 반드시 부모의 기본키와 이름이 같아야 원하는 결과값을 얻을 수 있음
    • SELF JOIN
      • 자기 자신을 2개 만들어서 JOIN 하는 것
      • 재귀적인 외래키가 있을 때 이를 이용하여 재귀적인 JOIN을 걸 수 있다.
  • Oracle JOIN
    • INNER JOIN
      • 오라클 JOIN은 JOIN 명령어 없이 ‘=’ 기호로 JOIN 기준을 잡는다.
      • PK가 아닌 컬럼만으로도 JOIN을 할 수 있지만, 시스템 상 서로 PK인 컬럼들을 WHERE 조건에 맞추는 것이 좋다.
    • OUTER JOIN
      • Outer 조인의 경우 ‘(+)’ 기호로 Outer JOIN을 수행한다.
      • A.DEPTCD = B.DEPTCD(+) 라고 설정했을 경우 A 테이블을 기준으로 B 테이블을 맞춘다.
      • 쉽게, A를 쭉 나열하고 B 중에 일치하는 값들을 끼워넣는다고 생각하면 된다.
-- ANSI JOIN QUERY
SELECT A.COMPANY  ,
       A.BUSNNO   ,
       A.DEPT     ,
       B.EMPNO    ,
       B.EMPNAME  ,
       B.RETIRE   ,
       C.POSITION
  FROM COMMON_COMPANY         A
  JOIN COMMON_EMPLOYEE        B
    ON A.COMPANY  = B.COMPANY
       A.DEPT     = B.DEPT
  LEFT OUTER JOIN EMP_DETAIL  C
    ON B.POSITION = C.POSITION
 ORDER BY 1, 2, 3, 4
-- ORACLE JOIN QUERY
SELECT A.COMPANY  ,
       A.BUSNNO   ,
       A.DEPT     ,
       B.EMPNO    ,
       B.EMPNAME  ,
       B.RETIRE   ,
       C.POSITION
  FROM COMMON_COMPANY  A,
       COMMON_EMPLOYEE B,
       EMP_DETAIL      C
 WHERE A.COMPANY  = B.COMPANY
       A.DEPT     = B.DEPT
       B.POSITION = C.POSITION(+)
 ORDER BY 1, 2, 3, 4

SET OPERATOR

  • UNION & UNION ALL
    • 두 테이블 간 데이터를 합치고자 할 때 사용되는 명령어
    • 컬럼의 갯수와 타입이 동일해야 정상적으로 실행된다.
    • UNION
      • 하나의 결과를 도출할 때, 중복을 허용하지 않는다.
      • 중복이 발생할 시 중복을 제거한다.
    • UNION ALL
      • 중복을 제거하지 않고 그대로 도출한다.
    • 보통 나는 TEMP테이블과 본 테이블을 비교할 때 사용한다.
  • MINUS (차집합)
    • 중복된 값 제거하는 명령어
    • A 테이블에 10만 건, B 테이블에 7만건, 이 둘에 동일한 데이터가 3만건 있다고 할 때, A MINUS B 일 경우 7만 건이 도출되며, B MINUS A일 경우 4만 건이 도출된다.

SUBQUERY

  • 단일 행/열 SUBQUERY
    • 비교 연산자 (= , >, < ETC)
  • 다중 행 SUBQUERY
    • 다중 행 비교 연산자 (IN, ANY, ALL ECT)
  • 다중 열 SUBQUERY
-- 다중 열 SUBQUERY
SELECT  EMP_ID   ,
        EMP_NAME ,
        DEPT_ID  ,
        SALARY
  FROM  EMPLOYEE
 WHERE (SALARY, DEPT_ID) IN (SELECT MIN(SALARY) ,
                                    DEPT_ID
                               FROM EMPLOYEE
                           GROUP BY DEPT_ID)
 ORDER BY 3;
  • NOT IN을 사용하기 위해서는 SUBQUERY에 NULL 값이 없어야 한다.

  • ANY / ALL

    • ALL 은 SUBQUERY 범위 밖에서 도메인을 정한다.
      • > ALL : SUBQUERY 범위의 최대값보다 큰 ALL 범위의 값을 본다.
      • < ALL : SUBQUERY 범위의 최소값보다 작은 ALL 범위의 값을 본다.
    • ANY 는 SUBQUERY 범위 안에서 도메인을 정한다.
      • > ANY : SUBQUERY 범위 중 최소값보다 큰 ANY 범위의 값을 본다.
      • < ANY : SUBQUERY 범위 중 최대값보다 작은 ANY 범위의 값을 본다.
    • 일하면서 한번도 사용해 본 적 없어요…
Written on February 29, 2020