hyeonga_code
Database_38_Oracle JOIN_ OUTER JOIN, SELF JOIN, 3 WAY JOIN 본문
Database_38_Oracle JOIN_ OUTER JOIN, SELF JOIN, 3 WAY JOIN
hyeonga 2023. 8. 1. 07:59-- 오라클 조인
-- FROM 절에 JOIN 키워드를 사용하지 않습니다.
-- 조인 조건을 WHERE 절에 작성합니다.
-- n 개의 테이블 조인을 위해 최소 n-1개의 조인 조건이 필요합니다.
-- 행을 제한하기 위해 WHERE 절에 조건을 추가해야 하는 경우 AND 연산자를 사용합니다.
/*
SELECT table1.column1, table2.column2
FROM table1, table2
WHERE table1.column1 = table2.column2;
*/
-- Outer JOIN
-- (+) 아우터 조인 연산자를 정보가 부족한 조인 옆에 작성합니다.
-- 아우터 조인 연산자는 하나 이상의 널 행을 생성합니다.
-- LEFT OUTER JOIN
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);
/*
EM_ID LAST_NAME SALARY DP_ID
-------------------------------------------------------
100 King 24000 90
101 Kochhar 17000 90
102 De Haan 17000 90
...
*/
-- 왼쪽 데이터를 확인 할 경우 오른쪽 데이터에 null 값을 추가해야합니다.
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);
/*
EM_ID LAST_NAME SALARY DP_ID
-------------------------------------------------------
100 King 24000 90
101 Kochhar 17000 90
102 De Haan 17000 90
...
*/
-- RIGHT OUTER JOIN
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
/*
EM_ID LAST_NAME SALARY DP_ID
-------------------------------------------------------
100 King 24000 90
101 Kochhar 17000 90
102 De Haan 17000 90
...
*/
-- 오른쪽 데이터를 확인 할 경우 왼쪽 데이터에 null 값을 추가해야합니다.
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
/*
EM_ID LAST_NAME SALARY DP_ID
------------------------------------------------------
100 King 24000 90
101 Kochhar 17000 90
102 De Haan 17000 90
...
*/
-- FULL OUTER JOIN을 지원하지 않습니다.
-- 한 문장에 (+)를 한 번만 지원합니다.
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id);
-- 1)
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id(+);
-- 2)
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id(+);
/*
<오류>---------------------------------------------------------------------------
ORA-01468: a predicate may reference only one outer-joined table
01468. 00000 - "a predicate may reference only one outer-joined table"
*Cause:
*Action:
103행, 26열에서 오류 발생
-----------------------------------------------------------------------------------
*/
-- FULL OUTER JOIN과 동일한 결과를 얻기 위함
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id
UNION
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);
-- 총 21개의 데이터가 출력됩니다.
/*
EM_ID LAST_NAME SALARY DP_ID
--------------------------------------------------------
100 King 24000 90
101 Kochhar 17000 90
102 De Haan 17000 90
...
*/
-- SELF JOIN
SELECT e.employee_id, e.last_name, e.salary, e.manager_id, m.last_name
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id)
WHERE e.commission_pct IS NULL
ORDER BY 3;
/*
EM_ID LAST_NAME SALARY M_ID LAST_NAME_1
-------------------------------------------------------------------------------
144 Vargas 2500 124 Mourgos
143 Matos 2600 124 Mourgos
142 Davies 3100 124 Mourgos
...
*/
SELECT e.employee_id, e.last_name, e.salary, e.manager_id, m.last_name
FROM employees e, employees m
WHERE e.manager_id = m.employee_id
AND e.commission_pct IS NULL
ORDER BY 3;
/*
EM_ID LAST_NAME SALARY M_ID LAST_NAME_1
-------------------------------------------------------------------------------
144 Vargas 2500 124 Mourgos
143 Matos 2600 124 Mourgos
142 Davies 3100 124 Mourgos
...
*/
-- 3-way JOIN
SELECT e.employee_id, e.last_name, e.job_id, d.department_name, l.city
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
JOIN locations l
ON (d.location_id = l.location_id);
/*
EM_ID LAST_NAME JOB_ID DP_NAME CITY
------------------------------------------------------------------------------------
100 King AD_PRES Executive Seattle
101 Kochhar AD_VP Executive Seattle
102 De Haan AD_VP Executive Seattle
...
*/
SELECT e.employee_id, e.last_name, e.job_id, d.department_name, l.city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id;
/*
EM_ID LAST_NAME JOB_ID DP_NAME CITY
------------------------------------------------------------------------------------
100 King AD_PRES Executive Seattle
101 Kochhar AD_VP Executive Seattle
...
*/
'Oracle Database' 카테고리의 다른 글
Database_40_SUB QUERY_서브쿼리 작성 실습 (0) | 2023.08.02 |
---|---|
Database_39_SUB QUERY_서브쿼리 기본 개념, 단일행, 다중행, 스칼라, 인라인 뷰 (0) | 2023.08.02 |
Database_37_Oracle JOIN_비등가 조인 (0) | 2023.08.01 |
Database_36_Oracle JOIN_등가 조인 (0) | 2023.08.01 |
Database_35_ANSI JOIN_Cartesian Product 카타시안 곱, Cross JOIN (0) | 2023.07.31 |