[ 조인(**)]
- 하나의 테이블로는 원하는 컬럼정보를 얻어올 수 없을때 관련된 테이블을 논리적으로 결합하여 원하는 컬럼정보를 얻어오는 방법.
- 조인조건 : 논리적으로 결합되는 1개이상의 테이블에는 반드시 '공통컬럼'이 존재해야 하며 이 공통컬럼은 동일한 데이터 타입이어야 한다.
1) EQUI조인
- 가장 일반적인 조인.WHERE 절에 공통컬럼들이 동등연산자(=)에 의해 비교되는 조인
예1)사원번호,이름,부서번호,부서이름,부서위치를 조회하시오.
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO;
EMPNO ENAME DEPTNO DNAME LOC
--------- --------- ---------- -------------- ----------
7369 SMITH 20 RESEARCH DALLAS
7499 ALLEN 30 SALES CHICAGO
7521 WARD 30 SALES CHICAGO
7566 JONES 20 RESEARCH DALLAS
7654 MARTIN 30 SALES CHICAGO
.....
예2) 30번 부서의 사원들의 사원번호,이름,부서번호,부서명을 출력하시오.
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO AND E.DEPTNO=30;
Q1) 부서명이 'ACCOUNTING'에 근무하는 사원들의 이름,급여,부서명을 출력해 보세요.
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO AND D.DNAME='ACCOUNTING';
2) CROSS JOIN
- 2개이상의 테이블에서 조인될때 공통컬럼에 의한 결합이 발생되지 않는경우 (일반적으로 실수로 조인을 하는 경우가 대부분임)
E.ENAME,
E.DEPTNO,
D.DNAME,
D.LOC
FROM EMP E,DEPT D;
EMPNO ENAME DEPTNO DNAME LOC
-------- -------- -------- ------------- ------------
7369 SMITH 20 ACCOUNTING NEW YORK
7499 ALLEN 30 ACCOUNTING NEW YORK
7521 WARD 30 ACCOUNTING NEW YORK
....
48 rows selected.
3) SELF 조인
- 참조해야 하는 컬럼이 자신의 테이블에 있는 다른 컬럼인 경우 사용되는 조인
예) 각 사원의 사원이름,매니저이름을 출력하시오.
FROM EMP E1,EMP E2
WHERE E1.MGR=E2.EMPNO
ORDER BY E1.EMPNO;
4) Outer 조인
- 한쪽 테이블에는 해당하는 데이터가 존재하는데 다른쪽 테이블에는 데이터가 존재하지 않는 경우 모든 데이터를 출력하게 하는 조인
예) 부서번호,부서명,사원이름을 출력하시오.
FROM DEPT D,EMP E
WHERE D.DEPTNO=E.DEPTNO(+);
Q1)EMP테이블과 DEPT테이블을 조인하여 부서번호,부서명,이름,급여 출력하세요.
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO;
Q2)이름이 'ALLEN'인 사원의 부서명을 출력하세요.
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO AND E.ENAME='ALLEN';
Q3)사원의 이름,부서번호,부서명,급여를 출력하시오.
(단,DEPT테이블의 모든 부서를 출력하세요.OUTER조인)
FROM EMP E,DEPT D
WHERE E.DEPTNO(+)=D.DEPTNO;
Q4)EMP테이블에 있는 EMPNO와 MGR을 이용해서 아래와 같이 출력되도록 하세요.
사원번호 사원이름 매니져이름 매니져직업
.......
FROM EMP E1,EMP E2
WHERE E1.MGR=E2.EMPNO
ORDER BY E1.EMPNO;
## ANSI조인
1) INNER 조인
예1) 사원번호,이름,부서명,부서위치를 조회하시오.
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO=D.DEPTNO;
예2) 급여가 2000이상인 사원번호,이름,부서명,급여를 조회하시오.
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO=D.DEPTNO
WHERE E.SAL>=2000;
Q1) 부서명'ACCOUNTING'에 근무하는 사원들의 이름,급여,부서명 출력하세요.
(INNER JOIN사용)
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO=D.DEPTNO
WHERE D.DNAME='ACCOUNTING';
2) OUTER조인
- RIGHT OUTER JOIN,LEFT OUTER JOIN,FULL OUTER JOIN
예1) 부서번호,부서명,근무사원이름,급여 출력
FROM DEPT D LEFT OUTER JOIN EMP E
ON D.DEPTNO=E.DEPTNO;
[ ROWID와 ROWNUM ]
- ROWID : ROW의 고유번호(중간에 ROW를 삭제해도 변하지 않음)
- ROWNUM(*) : 행의 인덱스(중간에 ROW삭제시 변함)
SQL> SELECT ROWID,ROWNUM,EMPNO FROM EMP;
------------------ ---------- ----------
AAAE+4AABAAAK/hAAA 1 7369
AAAE+4AABAAAK/hAAB 2 7499
AAAE+4AABAAAK/hAAC 3 7521
AAAE+4AABAAAK/hAAD 4 7566
...
예1) EMP테이블에서 급여가 가장 낮은 사람 10명의 번호,이름,급여를 출력하세요.(서브쿼리==>인라인뷰)
FROM (SELECT *
FROM EMP
ORDER BY SAL ASC)
WHERE ROWNUM<11;
Q1) 부서별 월급총액이 가장 많은 순서대로 2위까지 해당하는 부서와 월급총액을 출력하세요.
SUMSAL
FROM ( SELECT DEPTNO,
SUM(SAL) "SUMSAL"
FROM EMP
GROUP BY DEPTNO
ORDER BY SUM(SAL) DESC)
WHERE ROWNUM<3;
Q2) EMP테이블에서 가장 많은 JOB의 이름을 출력하시오.
SELECT JOB,COUNT(*) CNT
FROM EMP
GROUP BY JOB
ORDER BY CNT DESC)
WHERE ROWNUM=1;
'DBMS > 오라클기초' 카테고리의 다른 글
오라클 기초#6(Transaction Control Language) (0) | 2013.01.27 |
---|---|
오라클 기초#5(Data Manipulation Language) (0) | 2013.01.27 |
오라클 기초#3 (subquery) (0) | 2013.01.27 |
오라클 기초#2(함수) (0) | 2013.01.27 |
오라클 기초#1 (0) | 2013.01.27 |