조인
- 여러 테이블의 공통된 컬럼을 연결해서 필요한 데이터를 조회하는 방법을 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 |