본문 바로가기

Study/OracleDB

21강 오라클 SQL Outer Join

728x90

-- 1. Outer Join
-- 2. ANSI Join

select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno(+);
-- KING은 이 회사의 사장(PRESIDENT)으로 매니저가 존재하지 않으므로
-- MGR 컬럼 값이 NULL 입니다. 사원 번호(EMPNO)가 NULL인 사원은
-- 없으므로 조인 조건에 만족하지 않아 KING은 Seif Join의 결과에서 배제되었습니다.

-- 조인 조건에 만족하지 못하였더라도 해당 로우를 나타내고 싶을 때에 사용하는 것이 외부 조인(Outer Join)입니다.
-- 외부 조인은 NULL 값이기에 배제된 행을 결과에 포함시킬 수 있으며,"(+)" 기호를 조인 조건에서 정보가 부족한 컬럼 뒤에
-- 덧붙입니다.

-- 사원 번호(EMPNO)가 NULL인 사원은 없으므로 manger.empro 뒤에 "(+)" 기호를 덧붙입니다.
select employee.ename ||'의 매니저는'||manager.ename||'입니다.'
from emp employee, emp manager
where employee.mgr=manager.empno(+);

-- <탄탄히 다지기>
-- 6. 사원 테이블과 부서 테이블을 조인하여 사원이름과 부서번호와 부서명을 출력하도록 하라.
-- 부서 테이블의 40번 부서와 조인할 사원 테이블의 부서번호가 없지만, 아래 그림과 같이 40번
-- 부서의 부서 이름도 출력되도록 쿼리문을 작성 해보시오.
select e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno(+) = d.deptno;
-- 없는 내용도 포함(+)하라.

-- ANSI Join
-- 7.1 ANSI Cross Join
select * from emp cross join dept;

-- 7.2 ANSI Inner Join
-- ANSI 조인은 FROM 다음에 INNER JOIN 이란 단어를 사용하여 조인할 테이블 이름을 명시하고
-- ON 절을 사용하여 조인 조건을 명시하여 다음과 같이 작성합니다.
-- select * from table1 inner join table2 on table1.column1 = table2.column2;


-- ANSI 조인에서는 조인 정보를 ON절에 기술하여 조인 조건을 명확하게 지정하고, 다른 조건에
-- 대해서는 WHERE 구문에서 지정하면 됩니다.
-- Equi 조인
select ename, dname 
from emp, dept
where emp.deptno = dept.deptno and ename='SCOTT';

-- ANSI 조인
select ename, dname 
from emp 
inner join dept 
on emp.deptno=dept.deptno -- using으로 간편하게 가능 아래 참조
where ename='SCOTT';

-- USING을 이용한 조인 조건 지정하기
-- 두 테이블에 각각 조인을 정의한 컬럼의 이름이 동일하다면 USING
-- 절에서 조인할 컬럼을 지정하여 구문을 더 간단하게 표현할 수 있습니다.
-- select * from table1 join table2 using(공통컬럼)

-- EMP와 DEPT에 DEPTNO 라는 같은 이름의 컬럼이 있기 때문에 다음과 같이 간간하게 조인문을 기술할 수 있습니다.
select emp.ename, dept.dname
from emp inner join dept
using(deptno);

-- NATURAL Join
-- 두 테이블에 각각 조인을 정의한 컬럼의 이름이 동일하다면 USING
-- 절에서 조인할 컬럼을 지정하여 구문을 더 간단하게 표현할 수 있습니다.
-- select * from table1 NATURAL JOIN table2;

-- EMP와 DEPT에 DEPTNO라는 같은 이름의 컬럼이 있기 때문에 다음과 같이
-- 간단하게 조인문을 기술할 수 있습니다.
select emp.ename, dept.dname
from emp
natural join dept;

-- Outer Join은 LEFT Outer Join, RIGHT Outer Join 그리고
-- FULL Outer Join 세 가지 타입의 조인을 제공합니다.
-- select * from table1 [LEFT | RIGHT | FULL] Outer Join table2;

-- Outer Join은 이미 설명했듯이 어느 한쪽 테이블에는 해당하는 데이터가 존재하는데
-- 다른쪽 테이블에는 데이터가 존재하지 않을 경우 그 데이터가 출력되지 않는 문제점을
-- 해결하기 위해 사용하는 조인 기법입니다.

-- <실습하기> 다양한 Outer Join
-- 1. DEPT 테이블과 닮은 DEPT01 테이블을 만들어 보겠습니다. 혹시 DEPT01
-- 테이블이 존재한다면 DEPT01 테이블이 생성되지 않으므로 DROP 명령어로 삭제 후
-- 생성하도록 합시다.
DROP table dept01;

create table dept02(deptno number(2), dname varchar2(14));

insert into dept01 values(10, 'ACCOUNTING');
insert into dept01 values(20, 'RESEARCH');

select * from dept01;

create table dept02(deptno number(2), dname varchar2(14));

insert into dept02 values(10, 'ACCOUNTING');
insert into dept02 values(30, 'SALES');

select * from dept02;

-- DEPT01 테이블에 20번 부서와 조인할 부서번호가 DEPT02dpsms
-- 없지만, 20번 부서도 출력되도록 하기 위해서 DEPT01 테이블이
-- 왼쪽에 존재하기에 LEFT OUTER JOIN을 사용합시다.
select * from dept01 
left outer join dept02
on dept01.deptno = dept02.deptno;

-- DEPT02 테이블에만 있는 30번 부서까지 출력되도록 하기 위해서
-- RIGHT OUTER JOIN을 사용합시다.
select * from dept01
right outer join dept02
using(deptno);

-- FULL Outer Join은 Left outer join, Right outer join을 합한 형태
select * from dept01 full outer join dept02 using(deptno);

select e1.ename, e2.ename 
from emp e1 
left outer join emp e2 
on e1.mgr = e2.empno;

반응형

'Study > OracleDB' 카테고리의 다른 글

23강 오라클 SQL 서브 쿼리(2)  (1) 2022.09.10
22강 오라클 SQL 서브 쿼리(1)  (1) 2022.09.10
20강 오라클 SQL Self Join  (4) 2022.09.09
19강 오라클 SQL JOIN DATA  (1) 2022.09.09
18강 오라클 SQL HAVING 절  (1) 2022.09.09