실습 문제/oracle

[oracle] JOIN (오라클 구문 / ANSI표준 구문, OUTER JOIN)

좨랭이 2021. 10. 2. 13:29

JOIN 

하나 이상의 테이블에서 데이터를 조회하기 위해 사용하고 수행 결과는 하나의 Result Set으로 나옴

 

<JOIN>
        두 개 이상의 테이블에서 데이터를 조회하고자 할 때 사용되는 구문이다.
        무작정 데이터를 가져오는게 아니라 각 테이블 간에 공통된 컬럼으로 데이터를 합쳐서 하나의 결과(RESULT SET)로 조회한다.
        
        1. 등가 조인(EQUAL JOIN) / 내부 조인(INNER JOIN)
           연결시키는 컬럼의 값이 일치하는 행들만 조인되서 조회한다. (일치하는 값이 없는 행은 조회 X)


오라클 전용 구문

- FROM절에 ‘,’로 구분하여 합치게 될 테이블 명을 기술하고 WHERE절에 합치기에 사용할 컬럼 명 명시

1) 오라클 전용 구문
               [표현법]
                   SELECT 컬럼, 컬럼, 컬럼, ...
                   FROM 테이블1, 테이블2
                   WHERE 테이블1.컬럼명 = 테이블2.컬럼명;
               
               - FROM 절에 조회하고자 하는 테이블들을 콤마로(,) 구분하여 나열한다.
               - WHERE 절에 매칭 시킬 컬럼명에 대한 조건을 제시한다.

 

ex1) 연결할 두 컬럼이 다른 경우

 

ex2) 연결할 두 컬럼이 같은 경우

- 테이블명을 이용하는 방법

- 테이블의 별칭을 이용하는 방법

 

 

ANSI 표준 구문 

- 연결에 사용하려는 컬럼 명이 같은 경우 USING() 사용, 다른 경우 ON() 사용

2) ANSI 표준 구문
               [표현법]
                   SELECT 컬럼, 컬럼, 컬럼, ...
                   FROM 테이블1
                   JOIN 테이블2 ON(테이블1.컬럼명 = 테이블2.컬럼명);
               
               - FROM 절에 기준이 되는 테이블을 기술한다.
               - JOIN 절에 같이 조회하고자 하는 테이블을 기술 후 매칭 시킬 컬럼에 대한 조건을 기술한다.
               - 연결에 사용하려는 컬럼명이 같은 경우 ON 구문 대신에 USING(컬럼명) 구문을 사용한다.

 

ex1) 연결할 두 컬럼이 다른 경우 (ON)

 

ex2) 연결할 두 컬럼이 같은 경우 

- USING 구문을 이용하는 방법 (USING)

- 테이블의 별칭을 이용하는 방법 (ON (테이블 별칭))

 

ex3) NATURAL JOIN을 이용하는 방법 (참고만 하세요~!)

 

오라클 구문 / ANSI구문 실습문제

------------------- 실습 -------------------   
-- 1. DEPARTMENT 테이블과 LOCATION 테이블을 조인하여 부서코드, 부서명, 지역코드, 지역명을 조회
-- 오라클 구문
SELECT D.DEPT_ID, D.DEPT_TITLE, D.LOCATION_ID, L.NATIONAL_CODE
FROM DEPARTMENT D, LOCATION L
WHERE D.LOCATION_ID =L.LOCAL_CODE;

-- ANSI 구문
SELECT D.DEPT_ID, D.DEPT_TITLE, D.LOCATION_ID, L.NATIONAL_CODE
FROM DEPARTMENT D
JOIN LOCATION L ON LOCATION_ID = LOCAL_CODE;

-- 2. EMPLOYEE 테이블과 DEPARTMENT 테이블을 조인하여 보너스를 받는 사원들의 사번, 사원명, 보너스, 부서명을 조회
-- 오라클 구문
SELECT E.EMP_ID, E.EMP_NAME, E.BONUS, D.DEPT_TITLE
FROM EMPLOYEE E, DEPARTMENT D
WHERE DEPT_CODE = DEPT_ID AND BONUS IS NOT NULL;

-- ANSI 구문
SELECT E.EMP_ID, E.EMP_NAME, E.BONUS, D.DEPT_TITLE
FROM EMPLOYEE E
JOIN DEPARTMENT D ON (E.DEPT_CODE = D.DEPT_ID)
WHERE BONUS IS NOT NULL;

-- 3. EMPLOYEE 테이블과 DEPARTMENT 테이블을 조인하여 인사관리부가 아닌 사원들의 사원명, 부서명, 급여를 조회
-- 오라클 구문
SELECT E.EMP_NAME, D.DEPT_TITLE, E.SALARY
FROM EMPLOYEE E, DEPARTMENT D
WHERE DEPT_CODE = DEPT_ID AND DEPT_TITLE != '인사관리부';

-- ANSI 구문
SELECT E.EMP_NAME, D.DEPT_TITLE, E.SALARY
FROM EMPLOYEE E
JOIN DEPARTMENT D ON DEPT_CODE = DEPT_ID
WHERE DEPT_TITLE != 'D1';


SELECT * FROM EMPLOYEE;    -- DEPT_CODE
SELECT * FROM DEPARTMENT;  -- DEPT _ID   LOCATION_ID
SELECT * FROM LOCATION;    --            LOCAL_CODE    NATIONAL_CODE
SELECT * FROM NATIONAL;    --                          NATIONAL_CODE

-- 4. EMPLOYEE 테이블, DEPARTMENT 테이블, LOCATION 테이블을 조인하여 사번, 사원명, 부서명, 지역명 조회
-- 오라클 구문
SELECT E.EMP_ID, E.EMP_NAME, D.DEPT_TITLE, L.LOCAL_NAME
FROM EMPLOYEE E, DEPARTMENT D, LOCATION L
WHERE E.DEPT_CODE = D.DEPT_ID AND D.LOCATION_ID = L.LOCAL_CODE; /*AND LOCAL_NAME = 'ASIA1'*/

-- ANSI 구문 (다중 조인은 순서가 중요하다.)
SELECT E.EMP_ID, E.EMP_NAME, D.DEPT_TITLE, L.LOCAL_NAME
FROM EMPLOYEE E
JOIN DEPARTMENT D ON (E.DEPT_CODE = D.DEPT_ID)
JOIN LOCATION L ON (D.LOCATION_ID = L.LOCAL_CODE);
/*WHERE LOCAL_NAME = 'ASIA'*/

-- 5. 사번, 사원명, 부서명, 지역명, 국가명 조회
-- 오라클 구문
SELECT E.EMP_ID, E.EMP_NAME, D.DEPT_TITLE, L.NATIONAL_CODE
FROM EMPLOYEE E, DEPARTMENT D, LOCATION L
WHERE  E.DEPT_CODE = D.DEPT_ID AND D.LOCATION_ID = L.LOCAL_CODE;

-- ANSI 구문
SELECT E.EMP_ID, E.EMP_NAME, D.DEPT_TITLE, L.NATIONAL_CODE
FROM EMPLOYEE E
JOIN DEPARTMENT D ON (E.DEPT_CODE = D.DEPT_ID)
JOIN LOCATION L ON (D.LOCATION_ID = L.LOCAL_CODE);

 

INNER JOIN과 OUTER JOIN

- 기본적인 JOIN은 INNER JOIN

- 두 개 이상의 테이블을 조인할 때 일치하는 값이 없는 행은 조인에서 제외됨

- OUTER JOIN은 일치하지 않은 값도 포함이 되며 반드시 OUTER JOIN 명시

 

OUTER JOIN

- JOIN조건을 만족하지 못하는 행도 포함하여 조회하기 위해서는 OUTER JOIN을 해야한다.

기준이 되는 컬럼을 지정해야한다.

 

OUTER JOIN 종류 (ANSI)

1. LEFT OUTER JOIN

합치기에 사용한 두 테이블 중 왼쪽에 기술된 테이블의 컬럼 수를 기준으로 JOIN할 때

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

 

 

2. RIGHT OUTER JOIN

합치기에 사용한 두 테이블 중 오른쪽에 기술된 테이블의 컬럼 수를 기준으로 JOIN할 때

 

3. FULL OUTER JOIN 

합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함시킬 때

 

오라클 전용 OUTER JOIN (FULL OUTER JOIN은 사용할 수 없음 -> 에러발생)

데이터를 보여주는 쪽에 '(+)' 붙여준다. 

 

ex1) LEFT JOIN (ANSI 구문 / 오라클 구문)

 

ex2) RIGHT JOIN (ANSI 구문 / 오라클 구문)

 

ex3) FULL JOIN (ANSI 구문 / 오라클 구문(에러!!))