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이 되면 결과 값은 달라진다.
'Database - Oracle DB > 1주차(Database - Oracle DB)' 카테고리의 다른 글
[SQL] Advanced SQL - 날짜 함수 활용 (0) | 2019.01.04 |
---|---|
[SQL] DB 스터디 - 06 (0) | 2019.01.03 |
[SQL] DB 스터디 - 04 (0) | 2019.01.02 |
[SQL] Advanced SQL - 기본적인 SELECT 명령문 작성 (0) | 2019.01.02 |
[SQL] DB스터디 - 03 (0) | 2018.12.28 |