본문으로 바로가기

[DATABASE][JOIN]

category DATABASE 2018. 4. 20. 11:02



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

USING (공통컬럼)


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);



'DATABASE' 카테고리의 다른 글

[DATABASE][view]  (0) 2018.04.20
[DATABASE][SUBQUERY]  (0) 2018.04.20
[DATBASE][스키마]  (0) 2018.04.20
[DATABASE][GROUP FUNCTION]  (0) 2018.04.20
[DATABASE][데이터베이스의 분석 설계 과정]미완성  (0) 2018.04.19