[SQL] Join ORACLE/SQL 2012. 3. 29. 17:09

조인은 둘 이상의 테이블간 연계하여 데이터를 검색한다.

보통 PK와 FK를 이용하는데 조인 조건을 정의 하지않거나 잘못된 경우, 첫 테이블이 다음 테이블의 모든 행과 조인 될 경우 카테션 곱(Cartesian Product)이 일어나 상호 테이블간의 모든 데이터가 반환 되는 현상이 일어난다.

조인의 종류는 다음과 같다.

1. Equi Join - 조건절에 = 에 의해 일어난다.

SELECT A.DATA, B.DATA

FROM t_table A, t_table_sec B

WHERE A.ID = B.ID;

 

2. Non-Equi Join - = 외의 조인 조건을 가진는 경우

SELECT A.DATA, B.DATA

FROM t_table A, t_table_sec B

WHERE A.VALUE BETWEEN B.VALUE AND B.NEXT_VALUE;

 

3. Self-Join - 자기 스스로 조인 일어나는 것으로 두개의 테이블을 조인 하는 것 처럼 보이는 경우

SELECT A.DATA, B.DATA

FROM t_table A, t_table B

WHERE A.ID = B.ID;

 

4. Outer Join - LEFT, RIGHT, FULL OUTER JOIN이 있으며 두개의 테이블의 컬럼들에서 공통되는 값이 없을 경우 종종 이용한다. (+) 를 이용하여 사용하는데 값이 없는 측에 붙여 사용한다.

SELECT A.DATA, B.DATA

FROM t_table A, t_table_sec B

WHERE A.ID(+) = B.ID;

위와 같이 작성을 했으나 한쪽에 데이터가 맞지 않은 경우가 있다 가령 NULL 값이 들어간 경우이다.

결과가

A.DATA     B.DATA

-------     -------

1              1

               2

나와야 하는 경우 1에 대한 행만 나왔다면 다른 조건을 걸어 (+) 시켜 줘야한다.

 

4.1 LEFT OUTER JOIN - 오른쪽에 조인시킬 컬럼 값이 없을 경우

SELECT A.DATA, B.DATA

FROM t_table A LEFT OUTER JOIN t_table_sec B

WHERE A.ID = B.ID;

 

4.2 RIGHT OUTER JOIN - 쪽에 조인시킬 컬럼 값이 없을 경우

SELECT A.DATA, B.DATA

FROM t_table A RIGHT OUTER JOIN t_table_sec B

WHERE A.ID = B.ID;

 

4.3 FULL OUTER JOIN - 양측에 OUTER JOIN을 거는 경우

SELECT A.DATA, B.DATA

FROM t_table A LEFT FULL JOIN t_table_sec B

WHERE A.ID = B.ID;

 

5. INNER JOIN - 일반 조인에서 콤마 대신 INNER JOIN을 넣고 WHERE 대신 ON 넣는 방법

SELECT A.DATA, B.DATA

FROM t_table A INNER JOIN t_table_sec B

ON A.ID = B.ID;

 

6. NATURAL JOIN - Equi Join과 동일한 형태로 동일한 이름을 지니는 컬럼은 모두 조인이 된다. 또한 Alias는 사용하지 못하며 동일한 컬럼이 두개 이상일 경우 JOIN~USING을 이용하여 제어가 가능하다.

SELECT DATA, NAME FROM t_table NATURAL JOIN t_table_sec

 

7. JOIN~USING - NATURAL JOIN에 나타나는 문제를 제어하기 위한 것으로 해당하는 컬럼을 선택해서 조인이 가능하다. 또한 USING절 안에 포함되는 컬럼에 Alias를 지정하면 오류가 난다.

SELECT A.DATA, B.NAME, ID FROM t_table A JOIN t_table_sec B USING (ID)

 

8. ON - 조인 조건을 지정하며 논리 연산과 서브쿼리 지정이 가능하다.

SELECT A.DATA, B.NAME

FROM t_table A JOIN t_table_sec B ON (A.DATA = B.DATA)

                       JOIN t_table_third C ON (C.ID = A.ID)