JOIN
-한개 이상의 테이블에서 데이터를 조회하기 위서사용되는 조인에 대한 기본 개념과다양한 조인 방법에 대해서 살펴보겠습니다
조인의 필요성
-특정 부서 번호에 대한 부서이름은 무엇인지는 부서(DEPT) 테이블에 있습니다.
-특정 사원에 대한 부서명을 알아내기 위해서는 부서 테이블에서 정보를 얻어 와야 합니다.
-SCOTT인 사원이 소속되어 있는 부서의 이름이 무엇인지 알아보려고 합니다.
-SCOTT이란 사원의 부서명을 알아내는 일 역시 사원 테이블에서
SCOTT이 소속된 부서 번호를 알아낸 후에 부서 테이블에서 해당 부서 번호에
대한 부서명을 얻어 와야 합니다
-실습에서처럼 원하는 정보가 두 개 이상의 테이블에 나누어져 있다면 위와 같이
여러 번 질의를 해야 할까요?
-다행히도 SQL에서는 두 개 이상의 테이블을 결합해야만 원하는 결과를 얻을 수 있을 때 한 번의 질의로 원하는 결과를 얻을 수 있는 조인 기능을 제공합니다
CROSS JOIN
-다음은 Cross Join으로 특별한 키워드 없이 SELECT 문의 FROM 절에
사원(EMP) 테이블과 부서(DEPT) 테이블을 콤마로 연결하여 연속하여 기술하는
것입니다.
SELECT * FROM EMP, DEPT;
두 가지 테이 블에 대한 결과를 볼수 있다.
-Cross Join의 결과 얻어지는 컬럼의 수는 사원 테이블의 컬럼의 수(8)와
부서 테이블의 컬럼의 수를 더한 것이므로 8이 됩니다. 로우 수는 사원 한명에 대해서
DEPT 테이블의 4개의 로우와 결합되기에 56개(14*4)가 됩니다.
-Cross Join의 결과를 보면 사원 테이블에 부서에 대한 상세정보가 결합되긴 했지만, 조인 될 때 아무런 조건을 제시하지 않았기에 사원 한명에 대해서 DEPT 테이블의 4개의 로우와 결합된 형태이기에 Cross Join의 결과는 아무런 의미를 갖지 못합니다.
-조인 결과가 의미를 갖으려면 조인할 때 조건을 지정해야 합니다.
조인의 종류
EQUI JOIN
-EQUI JOIN은 가장 많이 사용하는 조인 방법으로 조인 방법으로서 조인 대상이 되는 두테이
블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인 방법
입니다.
-다음은 사원 정보를 출력할때 각 사원들이 소속된 부서의 상세정보를 출력하기 위해서 두 개
의 테이블을 조인한 예입니다.
SELECT *FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
-사원(EMP)테이블과 부서 (DEPT) 테이블의 공동 컬럼인 DEPTNO의 값이 일치(=)
되는 조건을 WHERE 절에 기술하여 사용하였습니다
-테이블을 조인하려면 일치되는 고통 컬럼을 사용해야 한다고 하였습니다.
컬럼의 이름이 같게 되면 혼동이 오기 때문에 컬럼 이름앞에 테이블 이름을
기술합니다.
(두테이블을 출력하게 되면 컬럼이 합친것을 알수 있다 )
EQUI JOIN에 AND 연산
이름이 SCOTT인 사람의 부서명을 출력
SELECT ENAME, DNAMEFROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO AND ENAME='SCOTT';
컬럼명의 모호성 해결
•두 테이블에 동일한 이름의 칼럼을 사용하면 어느 테이블 소속인지 불분명하기에 애매모호한 상태라는 오류 메시지가 출력됩니다.
SELECT ENAME, DNAME, DEPTNOFROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNOAND ENAME='SCOTT';
(출력해보기)
•이렇게 동일한 이름의 컬럼은 컬럼 명 앞에 테이블 명을 명시적으로 기술함으로서 컬럼이 어느 테이블 소속인지 구분할 수 있게 됩니다.
SELECT EMP.ENAME, DEPT.DNAME, EMP.DEPTNO
FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNOAND ENAME='SCOTT';
테이블에 별칭 부여
•테이블 이름에 별칭을 붙이는 방법은 FROM 절 다음에 테이블 이름을 명시하고 공백을 둔 다음에 칭을 지정하면 됩니다.
SELECT E.ENAME, D.DNAME, E.DEPTNO, D.DEPTNO
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNOAND E.ENAME='SCOTT';
NON-EQUI JOIN
-Non-Equi Join은 조인 조건에 특정 범위 내에 있는지를 조사하기 위해서
WHERE 절에 조인 조건을 = 연산자 이외의 비교 연산자를 사용합니다.
-NON-EQUI JOIN을 학습하기 전에 급여 등급 테이블(SALGRADE )을 살펴보겠습니다
SELECT * FROM SALGRADE;
문제
SELF JOIN
-조인은 두 개 이상의 서로 다른 테이블을 서로 연결하는 것뿐만 아니라, 하나
의 테이블 내에서 조인을 해야만 원하는 자료를 얻는 경우가 생깁니다.
-Self Join이란 말 그대로 자기 자신과 조인을 맺는 것을 말합니다.
-Self Join을 보다 구체적인 예를 통해서 알아보도록 합시다.
-SMITH의 매니저 이름이 무엇인지 알아내려면 어떻게 구해야 할까요?
OUTER JOIN(어려움)
-Seif Join을 학습하면 특정 사원의 매니저 이름을 구했습니다. 결과를 꼼꼼히 살펴보면 이름이 KING인 사원 한사람의 정보가 빠져 있음을 확인할 수 있습니다.
-KING은 이 회사의 사장(PRESIDENT)으로 매니저가 존재하지 않으므로 MGR럼 값이 NULL 입니다. 사원 번호(EMPNO)가 NULL인 사원은 없으므로 조인 조건에 만족하지 않아서 KING은 Seif Join의 결과에서 배제되었습니다.
-SELF JOIN을 학습하면 특정 사원의 매니져 이름을 구했습니다.
-결과를 꼼꼼히 살펴보면 이름이 KING 인 사원 한사람의 정보가 빠져 있음을 확인 할 수 있습니다.
-KING은 이 회사의 사장(PRESIDENT)으로 매니저가 존재 하지 않으므로 MGR 컬럼 값이 NULL입니다
사원은 없으므로 조인건에 만족하지 않아서 KING은 SEIF JOIN의 결과에서 배제되었습니다.
-조인 조건에 만족하지 못하더라도 해당 로우를 나타내고 싶을 때에 사용하는 것이 외부 조인 (OUTER JOIN)입니다
-외부 존인은 NULL 값이기에 배제된 행을 결과에 포함시킬 수 있으며 다은과 같이 "(+)" 기호를 조인 조건에서 정보가 부족한 칼럼 이름 뒤에 덧붙입니다.
-사원번호(EMPNO)가 NULL인 사원은 없으므로 manager.empnp뒤에"(+)"기호를 덧붙입니다.
SELECT employee.ename || ‘의 매니저는 ’
|| manager.ename || ‘입니다.’
FROM emp employee, emp manager
WHERE employee.mgr = manager.empno(+);
ANSI JOIN
-ANSI Cross Join
SELECT *
FROM EMP CROSS JOIN DEPT;
ANSI INNER JOIN
-새로운 ANSI 조인은 FROM 다음에 INNER JOIN 이란 단어를 사용하여 조인할 테이블 이름을 명시하고 ON 절을 사용하여 조인 조건을 명시하여 다음과 같이작성합니다.
SELECT * FROM table1 INNER JOIN table2
ON table1.column1 = table2.column2
-ANSI 조인에서는 조인 정보를 ON절에 기술하여 조인 조건을 명확하게 지정하고 다른 조건에 대해서는 WHERE 구문에서 지정하면 됩니다.
SELECT ENAME, DNAME
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO
WHERE ENAME='SCOTT';
USING을 이용한 조인 조건 지정하기
–두 테이블에 각각 조인을 정의한 컬럼의 이름이 동일하다면 USING 절에서 조인할 컬럼을 지정하여 구문을 더 간단하게 표현할 수 있습니다.
SELECT * FROM table1 inner JOIN table2
–EMP와 DEPT에 DEPTNO 라는 같은 이름의 컬럼이 있기 때문에 다음과 같이 간단하게 조인문을 기술할 수 있습니다.
SELECT EMP.ENAME, DEPT.DNAME
FROM EMP INNER JOIN DEPT
USING (DEPTNO);
NATURAL Join
–두 테이블에 각각 조인을 정의한 컬럼의 이름이 동일하다면 USING 절에서 조인할 컬럼을 지정하여 구문을 더 간단하게 표현할 수 있습니다.
SELECT * FROM table1 NATURAL JOIN table2
–EMP와 DEPT에 DEPTNO 라는 같은 이름의 컬럼이 있기 때문에 다음과 같이
간단하게 조인문을 기술할 수 있습니다.
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 세 가지 타입의 조언을 제공합니다
SELECT * FROM table1
[LEFT | RIGHT | FULL] Outer Join table2
-outer Join은 이미 설명했듯이 어느 한쪽 테이블에는 해당하는 데이터가 존재하
는데 다른 쪽 테이블에는 데이터가 존재하지 않을 경우 그 데이터가 출력되지
않는 문제점을 해경하기 위해 사용하는 조인 기법입니다
LEFT OUTER JOIN
-DEPT01 테이블의 20번 부서와 조인할 부서번호가 DEPT02에는
없지만, 20번 부서도 출력되도록 하기 위해서 DEPT01 테이블이 왼쪽에
존재하기에 LEFT OUTER JOIN을 사용합시다.
SELECT *
FROM DEPT01 LEFT OUTER JOIN DEPT02
ON DEPT01.DEPTNO = DEPT02.DEPTNO;
RIGHT OUTER JOIN
•DEPT02 테이블에만 있는 30번 부서까지 출력되도록 하기 위해서 RIGHT
OUTER JOIN을 사용합시다.
SELECT *
FROM DEPT01 RIGHT OUTER JOIN DEPT02
USING(DEPTNO);
FULL OUTER JOIN
FULL OUTER JOIN은 LEFT OUTER JOIN, RIGHT OUTER JOIN
을 합한 형태라고 볼 수 있습니다
SELECT *
FROM DEPT01 FULL OUTER JOIN DEPT02
USING(DEPTNO);