KH_ORACLE_05_조인
ORACLE
조인의 필요성
특정 부서 번호에 대한 부서이름은 무엇인지는 부서 테이블에 있다. 특정 사원에 대한 부서명을 알아내기 위해서는 부서 테이블에서 정보를 얻어 와야 한다.
SQL에서는 두 개 이상의 테이블을 결합해야만 원하는 결과를 얻을 수 있을 때 한 번의 질의로 원하는 결과를 얻을 수 있는 조인 기능을 제공한다.

Cross Join
특별한 키워드 없이 SELECT 문의 FROM 절에 사원 테이블과 부서 테이블을 콤마로 연결하여 연속하여 기술하는 것이다.
SELECT *
FROM EMP, DEPT;
Equi Join
Equi JOIN은 가장 많이 사용하는 조인 방법으로서 조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치하는 행을 연결하여 결과를 생성하는 조인 방법이다. WHERE 절을 사용해서 두 컬럼이 일치하는지 확인한다.
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
SELECT ENAME, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
AND ENAME='SCOTT';
SELECT ENAME, DNAME, DEPTNO -- 오류발생, 컬럼명의 모호성 문제
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND ENAME='SCOTT';
SELECT EMP.ENAME, DEPT.DNAME, EMP.DEPTNO -- 컬럼명의 모호성 해결
FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
AND ENAME='SCOTT';
SELECT E.ENAME, D.DNAME, E.DEPTNO, D.DEPTNO
FROM EMP E, DEPT D -- 테이블에 별칭을 부여함
WHERE E.DEPTNO = D.DEPTNO
AND E.ENAME='SCOTT';
Non-Equi Join
Non-Equi Join은 조인 조건에 특정 범위 내에 있는지를 조사하기 위해서 WHERE 절에 조인 조건을 = 연산자 이외의 비교 연산자를 사용한다.
SELECT * FROM SALGRADE;
SELECT ENAME, SAL, GRADE
FROM EMP, SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL;
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL >= S.LOSAL AND E.SAL <= S.HISAL;
Self Join
조인은 두 개 이상의 서로 다른 테이블을 서로 연결하는 것뿐만 아니라, 하나의 테이블 내에서 조인을 해야만 원하는 자료를 얻는 경우가 생긴다. Self Join 이란 말 그대로 자기 자신과 조인을 맺는 것을 말한다.
따라서 FROM 절에 동일 테이블이 두번 이상 나타난다.
동일 테이블 사이의 조인을 수행하면 테이블과 칼럼 이름이 모두 동일하기 때문에 식별을 위해 반드시 테이블 별칭을 사용해야 한다.
또한 칼럼에도 모두 테이블 별칭을 사용해서 어느 테이블의 칼럼인지 식별해주어야 한다.

SELECT EMPLOYEE.ENAME || '의 매니저는 ' || MANAGER.ENAME || '입니다.'
FROM EMP EMPLOYEE, EMP MANAGER
WHERE EMPLOYEE.MGR = MANAGER.EMPNO;
Outer Join
조인 조건에 만족하지 못하였더라도 해당 로우를 나타내고 싶을 때에 사용하는 것이 외부 조인이다. 외부 조인은 NULL 값이기에 배제된 행을 결과에 포함시킬 수 있으면 (+) 기호를 조인 조건에서 정보가 부족한 칼럼 이름 뒤에 덧붙인다.
SELECT EMPLOYEE.ENAME || '의 매니저는 ' || MANAGER.ENAME || '입니다.'
FROM EMP EMPLOYEE, EMP MANAGER
WHERE EMPLOYEE.MGR = MANAGER.EMPNO(+);
ANSI JOIN
오라클뿐만 아니라 현재 대부분의 상용 데이터베이스 시스템에서 표준 언어로 ANSI SQL에서 제시한 표준 기능을 대부분 준수하고 있다.
ANSI Cross Join
-- Oracle Cross Join
SELECT *
FROM EMP, DEPT;
-- ANSI Cross Join
SELECT *
FROM EMP CROSS JOIN DEPT;
ANSI Inner Join
Using을 이용한 조인 조건 지정하기
Natural Join : 자동적으로 모든 컬럼을 대상으로 공통 컬럼을 조사하여 내부적으로 조인문을 생성한다.
-- Oracle Equi Join
SELECT ENAME, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO;
-- ANSI Inner Join
SELECT ENAME, DNAME
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO;
-- USING을 이용한 조인 조건(공통컬럼) 지정
SELECT EMP.ENAME, DEPT.DNAME
FROM EMP INNER JOIN DEPT
USING (DEPTNO);
-- NATURAL Join
SELECT EMP.ENAME, DEPT.DNAME
FROM EMP NATURAL JOIN DEPT;
ANSI Outer Join
새로운 ANSI 구문에서 Outer Join은 LEFT Outer Join, RIGHT Outer Join 그리고 FULL Outer Join 세 가지 타입의 조인을 제공한다.
DROP TABLE DEPT01;
CREATE TABLE DEPT01(
DEPTNO NUMBER(2),
DNAME VARCHAR2(14)
);
INSERT INTO DEPT01 VALUES(10,'ACCOUNTING');
INSERT INTO DEPT01 VALUES(20,'RESEARCH');
SELECT * FROM DEPT01;
DROP TABLE DEPT02;
CREATE TABLE DEPT02(
DEPTNO NUMBER(2),
DNAME VARCHAR2(14)
);
INSERT INTO DEPT02 VALUES(10,'ACCOUNTING');
INSERT INTO DEPT02 VALUES(30,'SALES');
SELECT * FROM DEPT02;
-- Left Outer Join
SELECT *
FROM DEPT01 LEFT OUTER JOIN DEPT02
ON DEPT01.DEPTNO = DEPT02.DEPTNO;
-- Right Outer Join
SELECT *
FROM DEPT01 RIGHT OUTER JOIN DEPT02
USING(DEPTNO);
-- Full Outer Join
SELECT *
FROM DEPT01 FULL OUTER JOIN DEPT02
USING(DEPTNO);
LEFT OUTER JOIN
LEFT OUTER JOIN은 왼쪽 테이블의 것은 조건에 부합하지 않더라도 모두 결합되어야 한다는 의미이다.
즉, FROM 첫번째 테이블 LEFT OUTER JOIN 두번째 테이블이라면, 첫 번째 테이블의 것은 모두 출력되어야 한다.
아래 예시를 보자
-- 전체 회원의 구매기록을 살펴보자.
-- 단, 구매 기록이 없는 회원도 출력되어야 한다.
-- LEFT OUTER JOIN이므로, UserTable은 모두 출력된다
SELECT U.ID, Name, GoodName, Addr
FROM UserTable U -- LEFT Table
LEFT OUTER JOIN BuyTable B -- RIGHT Table
ON U.ID = B.ID
ORDER BY U.ID
INNER JOIN 시 INNER 키워드를 생략 가능했던 것처럼, LEFT OUTER JOIN도 LEFT JOIN으로 생략이 가능하다.
RIGHT OUTER JOIN
RIGHT OUTER JOIN은 오른쪽 테이블의 것은 조건에 부합하지 않더라도 모두 결합되어야 한다는 의미이다.
즉, FROM 첫번째 테이블 RIGHT OUTER JOIN 두번째 테이블이라면, 두 번째 테이블의 것은 모두 출력 되어야 한다.
RIGHT JOIN으로 생략이 가능하다.
FULL OUTER JOIN
전체 조인 또는 전체 외부 조인이라고도 한다.
FULL OUTER JOIN은 LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 합친 것이라고 생각하면 된다.
즉, 한 쪽을 기준으로 조건과 일치하지 않는 것을 출력하는 것이 아니라, 양쪽 모두에 조건이 일치하지 않는 것들까지 모두 결합하는 개념이다.
따라서 테이블들의 모든 행이 조건에 관계없이 결합된다.
댓글
댓글을 불러오는 중…