본문 바로가기
Programming/DB

[Oracle] JOIN

by AI_Wooah 2022. 3. 7.

테이블에 중복되는 값이 있음에도 나눠 놓는 이유

  • 바이트 단위로 생각했을 때 더 적게 쓰임
  • 중복값을 배제해서 데이터 이상현상 낮추는 효과
DAY_4

-- 
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5'
 UNION 
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY > 3000000;

-- UNION ALL : 여러 개의 쿼리 결과를 하나로 합치는 연산자
--             UNION과의 차이점은 중복 영역을 모두 포함시킨다.
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5'
 UNION ALL
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY > 3000000;
-- 조회하는 컬럼 수가 똑같기 때문에 에러가 발생하지 않음
-- 만약 다를 경우 빈 문자열의 경우 ''을 넣어줘야 컬럼 갯수가 맞아서 조회 가능하다.

-- INTERSECT : 여러 개의 SELECT한 결과에서 공통 부분만 결과로 추출
--             수학에서의 교집합과 비슷하다.
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5'
 UNION ALL
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5'
INTERSECT
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY > 3000000;

-- MINUS : 선행 SELECT 결과에서 후행 SELECT 결과와 겹치는 부분을 제외한
--         나머지 선행 SELECT 결과 부분만 추출, 수학에서 차집합과 비슷
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION ALL
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY > 3000000;
 
 SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5'
 MINUS
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY > 3000000;

-- JOIN : 두 개의 테이블을 하나로 합쳐서 결과를 조회한다.
-- ANSI 표준 구문
-- 연결에 사용할 컬럼명이 같은 경우 USING 사용한다.

SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
  JOIN JOB USING(JOB_CODE);

SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
 WHERE SALARY > 3000000;
 
 
 -- 연결에 사용할 컬럼 명이 같거나 다른 경우 ON()을 사용
 SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , SALARY
  FROM EMPLOYEE
  JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
 
-- 컬럼명이 같은 경우에도 ON()을 사용할 수 있다. 
 SELECT
       E.EMP_ID
     , E.EMP_NAME
     , E.JOB_CODE
     , J.JOB_NAME
  FROM EMPLOYEE E
  JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE);
 
-- 오라클 전용
-- FROM 절에 ','로 구분하여 합치게 될 테이블 명을 기술하고
-- WHERE절에 합치기에 사용할 컬럼명을 명시한다.
-- 연결에 사용할 두 컬럼명이 다른 경우
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , DEPT_TITLE
  FROM EMPLOYEE
     , DEPARTMENT
 WHERE DEPT_CODE = DEPT_ID;

-- 연결에 사용할 두 컬럼명이 같은 경우
SELECT
       EMPLOYEE.EMP_ID
     , EMPLOYEE.EMP_NAME
     , EMPLOYEE.JOB_CODE
     , JOB.JOB_NAME
  FROM EMPLOYEE.EMPLOYEE
     , EMPLOYEE.JOB
 WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;

-- 테이블의 별칭을 이용
SELECT
       E.EMP_ID
     , E.EMP_NAME
     , E.JOB_CODE
     , J.JOB_NAME
  FROM EMPLOYEE E
     , JOB J
  WHERE E.JOB_CODE = J.JOB_CODE;

-- 부서 테이블과 지역 테이블을 조인하여 테이블에 모든 데이터를 조회하세요
-- ANSI 표준
SELECT
    *
  FROM DEPARTMENT D
  JOIN LOCATION L ON(D.LOCATION_ID = L.LOCAL_CODE);

-- 오라클 전용
SELECT
       D.*
     , L.*
  FROM DEPARTMENT D
     , LOCATION L
 WHERE D.LOCATION_ID = L.LOCAL_CODE;

-- 조인은 기본이 EQUAL JOIN이다. (EQU JOIN 이라고도 함)
-- 연결되는 컬럼의 값이 일치하는 행들만 조인됨

-- 일치하는 값이 없는 행은 조인에서 제외되는 것을 INNER JOIN이라고 한다. (NULL 제외)

-- JOIN의 기본은 INNER JOIN & EQU JOIN이다.

-- OUTER JOIN : 두 테이블의 지정하는 컬럼 값이 일치하지 않는 행도(NULL)
--              조인 결과에 포함을 시킴
--              반드시 OUTER JOIN임을 명시해야 한다.
-- 1. LEFT OUTER JOIN
-- : 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 행의 수를 기준으로 JOIN
-- 2. RIGHT OUTER JOIN
-- : 합치기에 사용한 두 테이블 중 오른편에 기술된 테이블의 행의 수를 기준으로 JOIN
-- 3. FULL OUTER JOIN
-- : 합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함하여 JOIN
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
  JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

-- LEFT OUTER JOIN
-- ANSI 표준
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
  LEFT OUTER JOIN DEPARTMENT ON( DEPT_CODE = DEPT_ID);

-- 오라클 전용
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
     , DEPARTMENT
 WHERE DEPT_CODE = DEPT_ID(+);

-- RIGHT OUTER JOIN
-- ANSI 표준
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
 RIGHT OUTER JOIN DEPARTMENT
    ON (DEPT_CODE = DEPT_ID);

-- 오라클 전용
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
     , DEPARTMENT
 WHERE DEPT_CODE(+) = DEPT_ID;

-- FULL OUTER JOIN
-- ANSI 표준
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
 FULL OUTER JOIN DEPARTMENT
    ON (DEPT_CODE = DEPT_ID);

-- 오라클 전용
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
     , DEPARTMENT
 WHERE DEPT_CODE = DEPT_ID(+);

-- 오라클 전용 구문
-- 오라클 전용 구문으로는 FULL OUTER JOIN을 하지 못한다.

-- CROSS JOIN : 카테이션 곱이라고도 한다.
--              조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법이다.
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
 CROSS JOIN DEPARTMENT;
 

-- NON EQUAL JOIN(NON EQU JOIN) - 비등가조인
-- : 지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 조인한다.
-- ANSI 표준
SELECT
       EMP_NAME
     , SALARY
     , E.SAL_LEVEL
     , S.SAL_LEVEL
  FROM EMPLOYEE E
  JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL); --범위값에 의해 
  
 -- ORACLE 전용
SELECT
       EMP_NAME
     , SALARY
     , E.SAL_LEVEL
     , S.SAL_LEVEL
  FROM EMPLOYEE E
     , SAL_GRADE S
 WHERE E.SALARY BETWEEN S.MIN_SAL AND S.MAX_SAL;

-- SELF JOIN : 같은 테이블을 조인하는 경우
-- ORACLE 전용
SELECT
       E1.EMP_ID
     , E1.EMP_NAME 사원이름
     , E1.DEPT_CODE
     , E1.MANAGE_ID
     , E2.EMP_NAME 관리자이름
  FROM EMPLOYEE E1, EMPLOYEE E2
 WHERE E1.MANAGER_ID = E2.EMP_ID;

--ANSI 표준
SELECT
       E1.EMP_ID
     , E1.EMP_NAME 사원명
     , E1.DEPT_CODE
     , E1.MANAGER_ID
     , E2.EMP_NAME 관리자이름
  FROM EMPLOYEE E1
  JOIN EMPLOYEE E2 ON (E1.MAMAGER_ID = E2.EMP_ID);

-- 다중 JOIN : N 개의 테이블을 조회할 때 사용
-- ANSI 표준
-- 다중 조인에는 조인 순서가 중요하다.
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , DEPT_TITLE
     , LOCAL_NAME
  FROM EMPLOYEE
  JOIN DEPARTMENT ON (DEPT_CODE = LOCAL_CODE)
  JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);

-- 오라클 전용
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , DEPT_TITLE
     , LOCAL_NAME
  FROM EMPLOYEE
     , DEPARTMENT
     , LOCATION
 WHERE DEPT_CODE = LOCAL_CODE
   AND LOCATION_ID = LOCAL_CODE;

ON 뒤에는 서로 같은 값을 가지고 있는 행끼리 합쳐준다.

반응형

'Programming > DB' 카테고리의 다른 글

[Oracle] 테이블 생성 및 데이터 insert  (0) 2022.03.07
[Oracle] subquery  (0) 2022.03.07
[Oracle] GROUP BY & HAVING  (0) 2022.03.07
[Oracle] 함수  (0) 2022.03.07
[Oracle] 기본 조회 방법 및 연산자  (0) 2022.03.07

댓글