본문 바로가기
개발자/DB 오라클

데이터베이스 SQL 오라클 join ~ on 키워드

by mansfield 2022. 2. 23.
반응형

 

- join ~ on 키워드

-- 테이블과 테이블을 연결하여 특정한 데이터를 얻고자 할 때 사용하는 키워드 

-- 두 개 이상의 테이블에 정보가 나뉘어져 있을 때 사용.

-- 중복해서 데이터가 저장되는 것을 막기 위함.

-- 두 개의 테이블로 나누어진 경우에는 데이터의 중복은 발생하지 않지만 원하는 정보를 얻으려면 
-- 여러번 질의를 해야하는 불편함이 발생함

-- 특정 사원이 소속된 부서명을 알고싶은 경우에는 emp테이블과 dept테이블을 넘나드는 작업이 생기므로 불편하다.
-- 따라서 두 개의 테이블을 결합해 원하는 결과를 얻어낼 수 있도록 하는 조인이라는 기능이 생겨남.

--    join의 종류
-- 1) Cross Join

-- 2) Equi Join

-- 3) Self Join

-- 4) Outer Join

-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------

-- 1) Cross Join (좋은방법은 아님, 사용 거의 안함)
--    두 개 이상의 테이블이 조인될 때 조건없이 테이블의 결합이 이루어지는 조인. 
--    따라서 테이블 전체 행의 컬럼이 조인됨.
--    형식)  select * from 컬럼명1, 컬럼명2;
select * from emp, dept;


-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------


-- 2) Equi Join (가장 많이 사용)
--    조인의 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결하여 결과를 생성.
--    두 테이블이 조인을 하려면 일치되는 공통 컬럼을 사용하여야 함.

-- ex) emp 테이블에서 사원의 사번, 이름, 담당업무, 부서번호, 부서명, 근무위치를 화면에 보여주세요.
-- select * from emp where deptno = 10;
-- select * from dept where deptno = 10;
-- 기존대로라면 두번 쿼리문을 작성해야함. 따라서, 
-- ==> emp 테이블과 dept 테이블을 조인시켜 주어야 함.
--     select 컬럼명n from 테이블 join 테이블1 on 테이블.중복컬럼 = 테이블1.중복컬럼;

select empno, ename, job, e.deptno, dname, loc   -- 양쪽 테이블에 중복되는 deptno는 어느 테이블에 있는 컬럼인지 명시해야 함.
from emp e join dept d                       -- emp e 와 같이 별칭을 사용해서 간편하게 사용
on e.deptno = d.deptno;

-- ex) emp 테이블에서 사원이름이 'SCOTT'인 사원의 부서명을 알고 싶다면?
select ename, e.deptno, dname from emp e join dept d on e.deptno = d.deptno 
        where ename = 'SCOTT';  -- 조건절 추가

-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------

-- 3) Self Join
-- 하나의 테이블 내에서 조인을 해야 자료를 얻을 수 있는데 말 그대로 자기 자신고 조인을 맺는 것을 의미함.
-- from 절 다음에 테이블 이름을 나란히 두번 기술을 할 수 없음.
-- 따라서 같은 테이블이 하나 더 존재하는 것 처럼 사용할 수 있도록 테이블에 별칭을 붙여서 사용해야 한다.

-- emp 테이블에서 각 사원별 관리자의 이름을 화면에 출력해보자.
-- ex) CLERK의 매니저 이름은 KING 입니다. 
select e1.ename || '의 매니저 이름은 ' || e2.ename || '입니다.' as "관리자 이름"
from emp e1, emp e2
where e1.mgr = e2.empno;

--[문제] emp 테이블에서 매니저가 'KING'인 사원들의 이름과 담당업무를 화면에 보여주세요.
select e1.ename, e1.job, e1.mgr
from emp e1 join emp e2 
on e1.mgr = e2.empno
where e2.ename  = 'KING';

-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------


-- 4) Outer Join
--    2개 이상의 테이블이 조인이 될 때 어느 한 쪽 테이블에는 해당하는 데이터가,
--    다른쪽 테이블에는 데이터가 존재하지 않는 경우 그 데이터가 출력이 되지 않는 문제점을 해결하기 위해 사용.
--    정보가 부족한 테이블의 컬럼 뒤에 '(+)' 기호를 붙여 사용.

select e1.ename, e1.job, e1.mgr
from emp e1, emp e2 
where e1.mgr = e2.empno(+);

select ename, e.deptno, dname
from emp e, dept d
where e.deptno(+) = d.deptno;

 

 

300x250

댓글