본문으로 바로가기

조인

category ORACLE 2019. 11. 16. 01:50

조인


  • 여러 테이블의 공통된 컬럼을 연결해서 필요한 데이터를 조회하는 방법을 JOIN(조인)이라고 한다.
  • 오라클은 WHERE절로 조건을 지정해주지 않으면 가능한 모든 조건을 출력한다.
  • 참조 당하는 테이블을 '부모테이블(MASTER TABLE)', 참조하는 테이블을 '자식테이블(SLAVE TABLE)'이라고한다.

 

조인 종류

종류   설명
오라클 JOIN Certesian product 조인 조건을 생략하거나 조인이 잘 못된 경우에 발생한다.
equi 조인 기본키(PRIMARY KEY)와 참조키(FOREIGN KEY)를 사용하여 반드시 조건이 일치하는 데이터만 조회하는 방법이다.
non-equi 조인 조건이 반드시 일치하지 않더라도 범위에 포함되는 경우에 조회하는 방법
outer 조인 조건에 일치하지 않아도 조인 결과에 포함시키는 방법이다.
self 조인 자신의 테이블과 조인하는 방법이다.
ANSI 조인 cross 조인 오라클 조인의 Certesian product와 동일한 방법이다.
natural 조인 오라클 조인의 equi 조인과 동일하며, 자동으로 두개이 테이블에서 일치하는 컬럼을 찾아서 조인된다.
using(컬럼) 오라클 조인의 equi 조인과 동일하며, 명시적으로 일치하는 컬럼을 작성한다.
join~on절 오라클 조인의 non-equi 조인과 동일한 조인 방법. 
on절에 조인 조건을 명시한다.
left | right | full | outer 조인 오라클 조인의 outer 조인과 동일한 방법인다.
self 조인 오라클 조인의 self 조인과 동일한 방법이다

 

오라클 조인


  • 오라클DBMS에서만 사용 가능한 조인 방법
  • 여러 테이블을 연결하는 JOIN조건을 WHERE절에 명시

 

Equi 조인

  • 조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 반드시 일치하는 행을 연결하여 데이터를 반환하는 조인
  • 대부분 기본키(PRIMARY KEY)를 가진 테이블(MASTER)과 참조키(FOREIGN KEY)를 가진 테이블(SLAVE)을 조인할때 사용한다.
  • WHERE절에는 두 테이블의 공통 컬럼을 조인 조건으로 명시해야된다.
//문법
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.공통컬럼=테이블2.공통컬럼

//예시1
//EMP 테이블의 모든 사원들의  이름,부서번호,부서명을    출력해 보세요.
 SELECT  ename, emp.deptno, dname
 FROM emp,dept
 WHERE emp.deptno = dept.deptno ;
 
 //예시2
 // 급여가 3000 에서 5000 사이의 사원이름과 부서명을 출력해보세요.
 SELECT ename, dname
 FROM emp,dept
 WHERE emp.deptno = dept.deptno AND
 sal BETWEEN 3000 AND 5000 ;
 

공통 컬럼 사용시 모호성 제거

  • 공콩 컬럼 사용하는 경우 어느 테이블의 컬럼인지 소속이 불분명한 경우가 있기때문에 반드시 앞에 테이블 명을 지정해야한다.
//예시1
//EMP 테이블의 모든 사원들의  이름,부서번호,부서명을    출력해 보세요.
 SELECT  ename, emp.deptno, dname
 FROM emp,dept
 WHERE emp.deptno = dept.deptno ;

 

테이블 별칭(ALIAS) 사용

  • SELECT절 에서 ALIAS를 사용 할 수 있듯이 FROM절에서도 ALIAS를 사용할 수 있다.
  • 별칭을 지정한 이후에는 테이블명 대신 별칭을 사용항 컬럼을 참조할 수 있다.
  • 테이블 명칭 지정시 오라클 실행순서에 유념해서 SELET절 또는 FROM절에 별칭을 지정해야한다.
//문법
SELECT alias1.컬럼, alias2.컬럼
FROM 컬럼 alias1, 컬럼 alias2
WHERE alias1.공통컬럼=alias2.공통컬럼;

//예시1
//부서명이 'ACCOUNTNG' 인 사원의 이름,입사일,부서번호,부서명을 출력해보세요.
SELECT ENAME, HIREDATE, E.DEPTNO, DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO=D.DEPTNO AND DNAME='ACCOUNTING'

 

검색 조건 추가

  • 오라클 조인에서는 WHERE절에 AND, OR 연산자를 사용해 조인 조건에 검색 조건을 추가할 수 있다.
  • 가독성을 향상 시키기 위해 조인 조건을 먼저 명시하고, 나중에 검색조건을 명시하는 것이 좋다.
//예시1
//부서명이 'ACCOUNTNG' 인 사원의 이름,입사일,부서번호,부서명을 출력해보세요.
SELECT ENAME, HIREDATE, E.DEPTNO, DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO=D.DEPTNO AND DNAME='ACCOUNTING'

 

NON-Equi 조인 

안배움

 

SELF 조인

  • 필요에 의해 하나의 테이블만 사용하여 자기 자신을 조인할 수 있도록하는 것.
  • FROM절에 같은 테이블 명을 사용해야 되기 때문에 반드시 테이블 별칭을 사용해야한다.
  • 테이블 하나이상으로 SELF조인 할 수 있다.
//예시
// 각 사원의 이름과 매니져 이름을 출력하세요.
 
//오라클방식
SELECT A.ENAME, B.ENAME
FROM EMP A, EMP B
WHERE A.EMPNO=B.MGR;

//ANSI 방식
SELECT A.ENAME, B.ENAME
FROM EMP A INNER JOIN EMP B ON A.EMPNO=B.MGR
ORDER BY A.ENAME DESC

//연결 연산자를 이용해 하나의 문자열로 출력하기
SELECT e1.ename||'의 메니저는'||e2.ename||'입니다.'info
FROM emp e1, emp e2
WHERE e1.mgr=e2.empno;

INFO
--------------------------------------------------------------------------------
FORD의 메니저는JONES입니다.
JAMES의 메니저는BLAKE입니다.
TURNER의 메니저는BLAKE입니다.
MARTIN의 메니저는BLAKE입니다.
WARD의 메니저는BLAKE입니다.
ALLEN의 메니저는BLAKE입니다.
MILLER의 메니저는CLARK입니다.
CLARK의 메니저는KING입니다.
BLAKE의 메니저는KING입니다.
JONES의 메니저는KING입니다.
SMITH의 메니저는FORD입니다.

11 개의 행이 선택되었습니다.

 

OUTER 조인

  • 조인 조건에 만족하지 않아도 결과 값에 포함시키는 방법
  • (+)연산자를 조인하고자 하는 테이블 중에서 한번만 사용 할 수 있고, 일치하는 데이터가 없는 쪽에 지정한다.
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.공통컬럼 = 테이블2.공통컬럼(+);

 

 

ANSI 조인


USING(컬럼) 절

  • USING절을 사용하여 명시적으로 어떤 컬럼으로 조인할지를 지정할 수 있다.
  • 공통 컬럼에는 별칭(ALIAS)을 사용할 수 없다.
//문법
SELECT 테이블1.컬럼 테이블2.컬럼
FROM 테이블1 INNER JOIN 테이블2 USING(공통컬럼)
WHERE 검색조건;

//예시1
//커미션이 null 이 아닌 사원의 이름, 입사일, 부서명을 출력해보세요
SELECT ename, hiredate, dname
FROM emp INNER JOIN dept USING(deptno)
WHERE comm IS NOT NULL

 

ON절

  • NON-Equi조인 또는 임의의 조건으로 조인할 경우에는 ON절을 사용한다
  • JOIN조건과 검색조건 지정을 분리해서 표현할 수 있다.
//문법
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 INNER JOIN 테이블2 ON 조인조건
WHERE 검색조건;

//예시1
//부서명이 'ACCOUNTNG' 인 사원의 이름,입사일,부서번호,부서명을 출력해보세요.
SELECT ENAME, HIREDATE, E.DEPTNO, DNAME
FROM EMP E INNER JOIN DEPT D ON E.DEPTNO=D.DEPTNO
WHERE DNAME='ACCOUNTING';

//예시2
//커미션이 null 이 아닌 사원의 이름, 입사일, 부서명을 출력해보세요
SELECT ename, hiredate, dname
FROM emp e INNER JOIN dept d ON e.deptno=d.deptno
WHERE COMM IS NOT NULL

 

 

 

'ORACLE' 카테고리의 다른 글

오라클이 꺼져 있을때  (0) 2019.11.25
SUBQUERY 서브쿼리  (0) 2019.11.16
View(뷰) / Sequence(시퀀스) / SYNONYM(동의어)  (0) 2019.11.15
SQL 함수-그룹함수 / GROUP BY 절 / HAVING절  (0) 2019.11.15
SQL함수 / 단일행 함수  (0) 2019.11.15