본 포스트는 그루비에 있는 Oracle SQL Basic 요약본을 보고 정리한 내용임
--- dept 테이블과 emp 테이블을 조인하는 예제
SELECT e.empno, e.ename,d.dname
FROM dept d, emp e
WHERE d.deptno =e.deptno
콤마(,)대신 INNER JOIN을 사용할 수 있으며, INNER는 생략가능,JOIN조건은 ON절에 옴
--INNER JOIN절을 이용하여 조인하는 예제
SELECT e.empno, e.ename, d.dname
FROM dept d
INNER JOIN emp e
ON d.deptno = e.deptno
NATURAL JOIN을 사용하면 동일한 컬럼을 내부적으로 모두 조인하므로 ,ON절이 생략가능
--- JOIN~USING절을 이용하여 조인하는예제
SELECT e.empno, e.ename,deptno
FROM emp e
JOIN dept d
USING (deptno);
---emp 테이블과 slagrade 테이블의 Non-Equi Join 예제
SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal
BETWEEN s.losal
AND s.hisal;
ENAME SAL GRADE
---------- ---------- ----------
SMITH 800 1
JAMES 950 1
ADAMS 1100 1
...
---사원의 매니저명을 조회하는 Self Join 예제
SELECT e.ename, a.ename ="MANAGER"
FROM emp e ,emp a
WHERE e.empno =a.mgr;
ENAME Manager
------- ----------
FORD SMITH
BLAKE ALLEN
BLAKE WARD
KING JONES
...
--- CROSS JOIN절을 이용하여 Cartesian Product값을 얻는 예제
SELECT e.empno, e.ename, d.dname
FROM dept d CROSS JOIN emp e;
Equi Join과 Outer Join의 비교
--- Equi Join으로 부서 번호를 조회하는 예제
SELECT DISTINCT (e.deptno), d.deptno, d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno
DEPTNO DEPTNO
------ ----------
10 10
20 20
30 30
--- Outer Join으로 부서 번호를 조회하는 예제
SELECT DISTINCT (e.deptno), d.deptno
FROM emp e , dept d
WHERE e.deptno(+) = d.deptno;
DEPTNO DEPTNO
------- --------
10 10
20 20
30 30
40
Outer Join을 사용하는 테이블에 추가로 조건절이 있다면 (+)연산자를 모두 해야 함
Oracle9i 부터는 ANSI/ISO SQL 표준인 LEFT OUTER JOIN,RIGHT OUTER JOIN, FULL OUTER JOIN을 지원
LEFT OUTER JOIN은 오른쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용
RIGHT OUTER JOIN은 왼쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용
FULL OUTER JOIN은 양쪽 테이블 모두 Outer Join 걸어야 하는 경우에 사용
Cartesian Product값을 얻을때 사용
---일반적인 SQL문장
SQL> SELECT e.empno, e.ename
FROM dept d, emp e
WHERE d.deptno=e.deptno
--INNER JOIN SQL문장
SQL> SELECT e.empno, e.ename
FROM dept d INNER JOIN emp e
ON d.deptno =e.deptno
---일반적인 SQL문장
SQL> SELECT e.empno, e.ename, d.deptno
FROM emp e, dept d
WHERE e.deptno=d.deptno
--- NATURAL JOIN 사용한 SQL문장
SQL> SELECT e.empno, e.ename, d.deptno
FROM emp NATURAL JOIN dept
---일반적인 사용방법
SQL> SELECT e.empno,e.ename,deptno
FROM emp e JOIN dept d USING(deptno)
--테스트를 위해 scott유저에서 아래 insert문장을 실행
SQL> INSERT INTO bonus (ename, job,sal) VALUES('SMITH','CLERK',500);
---ON절 사용 예제(multi-table joins)
SQL> SELECT e.empno, e.ename, e.sal
FROM emp e JOIN dept d ON (e.deptno=d.deptno)
JOIN bouus b ON (b.ename=e.ename)
WHERE e.sal IS NOT NULL