JOIN!!

2013. 2. 6. 13:05

현재 오라클에서 사용하는 SQL은 T(Transaction)-SQL로 ANSI의 표준 SQL과는 
일부 차이가 있습니다. T-SQL이 편리한 점이 많지만 같은 내용의 SQL문이 벤더
 별로 차이가 남에 따라, ANSI SQL 3-1999에서는 모든 벤더가 표준 SQL문을 
지원하도록 하고 있으며, 오라클도 9i 버젼부터 사용이 가능합니다. 
 
대표적인 특징으로는 조인의 형태가 FROM 절에서 명시적으로 지정되며, 조인 
조건이 WHERE 절의 검색 조건과 구별되어 ON 절이나 USING 절에 표시됩니다. 
OUTER 조인의 경우 (+) 표시가 아닌 LEFT / RIGHT / FULL OUTER JOIN 문법
을 사용할 수 있습니다.


1) CROSS JOIN


예문)

SELECT ENAME, DNAME
FROM EMP CROSS JOIN DEPT;

크로스 조인은 두 개의 테이블에 대한 Cartesian Product와 같은 결과입니다.
의도적으로 데이터를 복제하기 위해 카테시안 프로덕트를 사용한 것이 아니라면, 
크로스 조인은 사용하지 않는 것이 바람직합니다.


2) NATURAL JOIN


예문)

SELECT *
FROM EMP NATURAL JOIN DEPT;

내츄럴 조인은 모든 동일한 이름을 갖는 칼럼들에 대해 조인을 합니다. 
즉, NATURAL 조인은 자동적으로 두 테이블에서 같은 이름을 가진 모든 칼럼에 
Equi Join을 수행합니다.

이때, 조인 칼럼들은 같은 데이터 유형이어야 하며, Alias나 테이블 명과 같은 
접두사를 붙일 수 없습니다. 만일 같은 이름을 가지는 칼럼들이 서로 다른 데이터 
형을 가질 때에는 오류가 반환됩니다.

그리고, SELECT * 문법을 사용한다면, 공통 칼럼들은 결과 집합에서 한 개만 표현
됩니다.


3) USING JOIN


예문)

SELECT E.EMPNO, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
USING (DEPTNO);

내츄럴 조인에서는 자동적으로 이름이 일치되는 모든 칼럼들에 대해 조인이 이루어지
지만, USING 절을 이용하면 원하는 칼럼에 대해서만 선택적으로 Equi Join을 할 수
가 있습니다.

만일 여러 개의 칼럼이 이름은 같지만 데이터 형이 모두 일치하지 않거나, 몇 개의 
칼럼만 선택적으로 조인 조건에 사용하고자 할 때는 Using 절을 이용하여 Equi Join
에 사용될 칼럼들을 지정할 수 있습니다.
USING 절을 이용한 Equi Join에서도 내츄럴 조인과 마찬가지로, 조인 칼럼에 대해서는
 Alias나 테이블 명과 같은 접두사를 붙일 수 없으며, Natural과 Using의 두 키워드는 
상호 배타적으로 사용됩니다.


4) ON JOIN


예문)

SELECT E.ENAME, E.DEPTNO, D.DNAME 
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO)
WHERE E.SAL > 1000;

조인 서술부(ON 절)와 비조인 서술부(WHERE 절)를 분리하여 이해가 쉽습니다.
ON 절을 이용하면 JOIN 이후에 논리 연산과 서브쿼리와 같은 추가 서술을 할 수 있습
니다.

Natural 조인과 달리 ON 조인은, 임의의 조인 조건을 지정하거나, 이름이 다른 칼럼
끼리 조인 조건으로 사용하거나, 조인할 칼럼을 명시하기 위해서 사용합니다.

● 여러 테이블의 조인

SELECT E.EMPNO, D.DNAME , B.SAL
FROM EMP E JOIN DEPT D  
ON ( E.DEPTNO = D.DEPTNO )
  JOIN BONUS B
ON ( E.ENAME = B.ENAME );

● WHERE 절과의 혼용

SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME 
FROM EMP E JOIN DEPT D
ON  ( E.DEPTNO = D.DEPTNO )
WHERE E.EMPNO >= 7000;

● ON 절의 조건 추가

SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D 
ON ( E.DEPTNO = D.DEPTNO  AND  E.MGR = 7698 );

● EXIST 절 사용

SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, B.BONUS
FROM EMP E JOIN DEPT D 
ON ( E.DEPTNO = D.DEPTNO 
     AND NOT EXISTS (SELECT 1 
                         FROM BONUS B 
                        WHERE E.ENAME = B.ENAME) );


5) OUTER JOIN


지금까지 오라클에서 제공하였던 Outer Join 표기는 (+)를 사용했지만, 이해가 
어렵고 실수를 유발하기 쉽다는 단점이 있습니다.

ANSI SQL-3의 기준을 오라클 9i에서 수용하면서 LEFT / RIGHT OUTER 조인뿐
만 아니라, 그 동안 UNION이나 UNION ALL을 이용해서 처리하던 양쪽 아우터 
조인도 FULL OUTER JOIN 문법으로 새로 추가 되었습니다.

● LEFT OUTER JOIN

Table A와 B가 있을 때 왼쪽에 있는 Table A가 기준이 됩니다. A와 B를 비교해서
 같은 것이 있을 때 그 해당 Data를 가져오고, B가 없는 경우에도 가져오는데 B에서 
가져오는 칼럼은 NULL 값으로 표시됩니다.

SELECT E.ENAME, E.DEPTNO, D.DNAME 
FROM EMP LEFT OUTER JOIN DEPT 
ON (EMP.DEPTNO = DEPT.DEPTNO);

● RIGHT OUTER JOIN

Table A와 B가 있을 때 오른쪽에 있는 Table B가 기준이 됩니다. A와 B를 비교해서
같은 것이 있을 때 그 해당 Data를 가져오고, A가 없는 경우에도 가져오는데 A에서 
가져오는 칼럼은 NULL 값으로 표시됩니다.

SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP RIGHT OUTER JOIN DEPT 
ON (EMP.DEPTNO = DEPT.DEPTNO);

● FULL OUTER JOIN

Table A와 B가 있을 때 (Table A, B 모두 기준), Left Outer Join과 Right Outer Join의 
결과를 UNION으로 합친 것과 같습니다.

SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP FULL OUTER JOIN DEPT 
ON (EMP.DEPTNO = DEPT.DEPTNO);  
이것만은 기억하자!

[출처] http://blog.naver.com/chanseog?Redirect=Log&logNo=20000703888

Posted by 사라링
BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :