현재 오라클에서 사용하는 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
'오라클' 카테고리의 다른 글
list 의 특정 컬럼 을 한줄로 표현 하기 . (0) | 2013.05.10 |
---|---|
jsp BLOb 타입 다운로드 (0) | 2013.03.13 |
DB 부하율 검색 쿼리 (1등하면 안좋은것..) (0) | 2013.01.29 |
TABLE DROP 복구 하기. PURGE 를 사용한 경우 복구 X (0) | 2013.01.14 |
컬럼명으로 특정 테이블을 찾는 쿼리 (0) | 2012.12.20 |