▶ 조인?

 각 테이블에서 하나의 컬럼을 사용하여 두개 이상의 테이블을 연결하는 것

▶CROSS JOIN은 구문중에 WHERE절을 가지고 있지 않아, 양쪽 테이블의 모든 행에 대해서로 연결을 하게 됩니다.

▶SELF JOIN은 테이블의 행을 같은 테이블 안에 있는 다른 행과 연관시킵니다.

▶ 내부 조인은 조인 조건을 만족하는 로우만 선택

▶ 외부 조인은 조인 조건을 만족하는 로우만 선택

▶ 관계된 테이블에서 일치하지않는 OUTER 테이블의 모든 행을 보여줍니다.

▶ FULL OUTER JOIN의 경우, ANSI SQL 문법으로 밖에 표현이 안됩니다.

 

▶CROSS JOIN

특별한 키워드 없이 SELECT 문의 FROM절에 사원테이블과 부서테이블을 콤마로 연결해서 연속으로 기술하는 것

SELECT * FROM EMP,DEPT;

▶ EQUI JOIN

조인 대상이 되는 두 테이블에서 공동으로 존재하는 컬럼의 값이 일치 되는 행을 연결하여 결과를 생성하는 조인 방법

 

SELECT A.EMPLOYEE_ID,A.FIRST_NAME,A.DEPARTMENT_ID,B.DEPARTMENT_NAME

FROM EMPLOYEES A,DEPARTMENTS B

WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID; 

//공통적으로 존재하는 부서번호(DEPARTMENT_ID)를 등호 연산자를 사용해 조회조건에 명시

▶SEMI-JOIN 

서브쿼리를 사용해 서브쿼리에 존재하는 데이터만 메인쿼리에서 추출하는 조인 방법

IN과 EXISTS 연산자를 사용한 조인.

서브쿼리에 있는 테이블B, 메인쿼리에 사용된 테이블A라고 한다면 세미조인은 B테이블에 존재하는 A테이블의 데이터를 추출하는 조인

1) EXISTS사용

 

SELECT DEPARTMENT_ID,DEPARTMENT_NAME FROM DEPARTMENTS A 
WHERE EXISTS(SELECT * FROM EMPLOYEES B WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID AND B.SALARY > 3000)
ORDER BY A.DEPARTMENT_NAME;

 

2) IN 사용

SELECT DEPARTMENT_ID,DEPARTMENT_NAME FROM DEPARTMENTS A WHERE A.DEPARTMENT_ID IN 
(SELECT B.DEPARTMENT_ID FROM EMPLOYEES B WHERE B.SALARY>3000)
ORDER BY DEPARTMENT_NAME;

EXIST의 경우는 WHERE절에 EXISTS 연산자를 사용하고 부서 테이블과 조인 조건은 서브 쿼리에서 명시

반면 IN연산자를 사용한 2)는 서브 쿼리 내에 두 테이블의 조인조건이 없다는 점 주의

▶외부 조인(OUTER JOIN)

조인조건에 만족하는 데이터 뿐만 아니라,어느한쪽 테이블에 조인조건에 명시된 컬럼에 값이 없거나 해당 로우가 아예 없더라도 데이터를 추출한다.

 

SELECT A.DEPARTMENT_ID,A.DEPARTMENT_NAME,B.JOB_ID,B.DEPARTMENT_ID 
FROM DEPARTMENTS A,JOB_HISTORY B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID(+) ;

//조인조건에서 데이터가 없는 테이블의 컬럼에 (+) 기호를 붙이는 것이 외부 조인

//조인조건 모두에 (+)를 붙여야 한다.

//한번에 한 테이블에만 외부조인을 할 수 있다.

//(+)연산자가 붙은 조건과 OR를 같이 사용할수 없다.

//(+)연산자가 붙은 조건에는 IN연산자를 같이 사용할수 없다.

 

 

▶NON-EQUI JOIN

조인 조건이 특정 범위 내에 있는 지를 조사하기 위해서 , WHERE 절에 조인조건을 = 연산자 이외에 비교 연산자를 사용

▶SELF JOIN

▶ANSI JOIN

ºANSI 내부 조인

<기존문법>

SELECT A.EMPLOYEE_ID,A.FIRST_NAME,B.DEPARTMENT_ID,B.DEPARTMENT_NAME 
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
AND A.HIRE_DATE>= TO_DATE('1990-01-01','YYYY-MM-DD');

 

<ANSI문법>

SELECT A.EMPLOYEE_ID,A.FIRST_NAME,B.DEPARTMENT_ID,B.DEPARTMENT_NAME 
FROM EMPLOYEES A
INNER JOIN DEPARTMENTS B ON (A.DEPARTMENT_ID = B.DEPARTMENT_ID )
WHERE A.HIRE_DATE>= TO_DATE('1990-01-01','YYYY-MM-DD');

 

FROM절에서 INNER JOIN구문을 쓴다.

조인조건은 ON절에 명시하고,조인조건 외의 조건은 기존대로 WHERE절에 명시한다. 만

약 조인 조건컬럼이 두 테이블 모두 동일하다면 ON대신 USING절을 사용할수 있는데,

이때는 SELECT절에서 조인 조건에 포함된 컬럼명을 테이블명,컬럼명형태가 아닌 컬럼명만 기술해야한다.

+ Recent posts