Database - Oracle DB/1주차(Database - Oracle DB)

[SQL] DB 스터디 - 05

김야키 2019. 1. 3. 09:57


OUTER JOIN과 직접 일치하지 않는 레코드 반환


-리뷰-

  • FROM절에서 테이블 이름에 별칭을 준다면 AS를 사용하는 것은 에러를 유발 시킴
  • 별다른 조건이 없다면 테이블이 결과를 낼 수 있는 모든 경우의 수를 출력 함
  • 항상 JOIN은 똑같은 행의 개수의 결과만 출력 함
  • 각 테이블의 컬럼의 명칭이 서로 같다면 별칭을 이용해 해당 테이블의 컬럼임을 인식 시켜야 함


1. OUTER JOIN

- 조건 절에서 일치하지 않는 값을 함께 출력하기 위한 JOIN문

- [LEFT, RIGHT, POOL ] OUTER JOIN 등이 있음

- LEFT, RIGHT, FULL은 각각 더 많은 데이터를 가지고 있는 테이블의 결과를 출력

- 어느 한 쪽에 데이터가 더 있다는 전제를 가지고 있음

- FROM절에 테이블의 방향을 정해 주면, 해당 태이블의 정보를 기준으로 값을 출력 함

- 2차원의 표집합이기 때문에 해당하지 않는 컬럼들의 값들은 NULL로 채워져서 출력 함

- 결론, 두 테이블 중에서 더 많은 데이터를 보기 위한 테이블을 먼저 생각 한 뒤에 JOIN 쿼리를 작성

예)

->

-- LEFT OUTER JOIN

-- dept테이블의 40번 부서를 출력하기 위한 LEFT OUTER JOIN문

-- 40번 부서의 정보는 왼쪽 즉, dept 테이블에 있음

SELECT 

    E.empno, E.ename, E.deptno,

    D.deptno, D.dname

FROM 

    dept D 

LEFT OUTER JOIN emp E

ON

    D.deptno = E.deptno;

-- 3개 이상의 테이블에서 dept테이블의 값을 함께 계속 보기를 원할 때

-- dept 테이블을 먼저 쓰고 각 테이블 들을 LEFT OUTER JOIN으로 작성 시킴

-- 결과에 dept에서 40번 부서를 출력 하고 나머지 컬럼은 NULL로 채워짐

SELECT *

FROM dept D

LEFT OUTER JOIN emp E

ON

    D.deptno = E.deptno

LEFT OUTER JOIN salgrade S

ON

    E.sal BETWEEN S.losal AND S.hisal;


-- RIGHT OUTER JOIN

-- 부서 번호가 190번 부서 까지 출력하기 위한 RIGHT OUTER JOIN문

-- 190번의 부서 정보는 오른쪽 즉, departments 테이블에 있음

SELECT 

    E.employee_id, E.last_name, E.department_id,

    D.department_id, D.department_name

FROM employees E

RIGHT OUTER JOIN departments D

ON 

    E.department_id = D.department_id;


-- ORACLE JOIN

-- ORACLE JOIN의 경우 (+)가 붙은 것을 기준으로 추가적인 데이터의 유무를 알림

-- 테이블의 순서가 필요 없음

-- 컬럼의 순서도 필요 없음

-- (+)가 붙어 있는 쪽이 데이터를 덜 가지고 있는 것

-- 하지만 FULL OUTER JOIN은 지원하지 않음

-- 190번 부서의 정보까지 출력하기 위한 ORACLE JOIN의 OUTER JOIN

SELECT 

E.employee_id, E.last_name, E.department_id, 

D.department_id, D.department_name

FROM 

employees   E   ,departments D 

WHERE 

E.department_id (+) = D.department_id;




2. Cartesian Product

- 모든 연결된 경우의 수를 보는 경우에 사용

- CROSS JOIN을 사용함

- 두 테이블의 교차 곱을 생성




3. JOIN의 조건문 추가

- OUTER JOIN은 기본적으로 더 많은 테이블의 데이터를 보기 위함 임

- 남은 컬럼은 모두 NULL로 채워져서 출력 됨

- 따라서 WHERE절에서 조건 절을 추가 하는 경우 NULL은 조건을 판별할 수 없기 때문에 해당 행은 출력 안됨

- 그러한 상황을 회피하기 위해 조건 절에 OR 컬럼 IS NULL을 추가하는 방법이 있음

- 혹은, WHERE 대신 AND를 사용하여 작성 해도 가능 함

예)

->

-- dept의 모든 부서를 출력 하면서 사원의 급여가 2000보다 큰 급여를 받는 사원들의 정보를 출력 하는 방법


-- OR IS NULL을 사용하는 SQL 구문

-- OUTER JOIN을 먼저 수행 하고 조건을 검사

-- 10번과 40번 부서만 출력 됨

SELECT * 

FROM dept D --1

LEFT OUTER JOIN emp E --2

ON

    D.deptno = E.deptno --3

WHERE 

    E.sal > 3000 OR E.sal IS NULL; --4


-- WHERE 대신 AND를 사용하는 경우

-- 조건을 먼저 검사 하고 OUTER JOIN을 수행

-- 10 ~ 40번 까지의 부서가 모두 출력 됨

SELECT * --5

FROM dept D --1

LEFT OUTER JOIN emp E --2

ON

    D.deptno = E.deptno --4

AND 

    E.sal > 3000; --3

-- 위의 두 SQL 명령문은 같은 결과를 낸다.

-- 하지만 급여의 범위가 3000이 되면 결과 값은 달라진다.