반응형

조인(JOIN)

- 각 테이블 간에 공통된 컬럼(조건)으로 데이터를 합쳐 표현하는 것.
- (권장) 최대 5개 이하의 테이블정도만 조인
내부조인(INNER JOIN) : (=교집합)
- 두 테이블에 공통을 존재하는 컬럼을 이용하여 합치는 방식
1. 동등조인(EQUI JOIN)
: 공통 존재 컬럼의 값이 같은 경우를 추출하는 조인 방식
(INNER JOIN, ANSI INNER JOIN)
--[INNER JOIN]
SELECT * FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

--[ANSI INNER JOIN]
SELECT * FROM EMP
(INNER) JOIN DEPT
ON EMP.DEPTNO = DEPT. DEPTNO;
2. 교차 조인(CROSS JOIN=CATASIAN JOIN)
- 조인 조건이 없는 조인 방식
(CROSS JOIN, ANSI CROSS JOIN)
SELECT * FROM EMP, DEPT;

SELECT * FROM EMP
CORSS JOIN DEPT ;
 
외부조인(OUTER JOIN) : (=A 또는 B 또는 합집합)
- 특정 테이블의 모든 데이터를 기준으로 다른 테이블의 정보를 추출 (다른 테이블에 값이 없어도 출력됨)
1. 왼쪽 외부 조인(LEFT OUTER JOIN) = A
: 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 동일 데이터를 추출
(LEFT OUTER JOIN, ANSI LEFT JOIN)
 
2. 오른쪽 외부 조인(RIGHT OUTER JOIN) = B
: 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 동일 데이터를 추출
(RIGHT OUTER JOIN, ANSI RIGHT JOIN)
 
3. 완전 외부 조인(FULL OUTER JOIN) = 합집합
: 양쪽의 모든 데이터를 추출
(ANSI FULL OUTER JOIN)
--컬럼이 *인 경우 두 테이블의 모든 컬럼 출력.
SELECT * FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

--동일컬럼명이 있을 경우 _N가 붙는다.
*Equi Join (동등조인, 가장 많이 사용)
- WHERE절에서 조인 조건을 사용 (권장:조인 조건개수 = 연결 테이블 수 - 1)
- 명확성을 위해 컬럼명 앞에 테이블명 또는 테이블 별칭을 설정
 
SELECT [테이블별칭1.]컬럼명, [테이블별칭1.]컬럼명, [테이블별칭2.]컬럼명, [테이블별칭2.]컬럼명
FROM 테이블명1 [테이블별칭1], 테이블명2 [테이블별칭2], ...
WHERE 테이블명1.동일값컬럼명 = 테이블명2.동일값컬럼명 ;
--부서번호를 기준으로 같은 값을 가진 사원 테이블과 부서 테이블 결합
SELECT ENAME, DNAME, DEPT.DEPTNO
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
SELF JOIN : 동일 테이블 사이의 조인
조건 :
<필수> 테이블의 별칭이 존재해야 하며, 컬럼명시할 경우 테이블의 별칭 생략불가
--ex)사원 이름 및 사원번호를 해당 관리자 이름 및 관리자 번호와 함께 표시
SELECT E1.ENAME 사원이름, E1.EMPNO 사원번호, E2.ENAME 관리자이름, E1.MGR 관리자번호
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO(+)
ORDER BY E1.MGR;

SELECT E1.ENAME||'의 매니저는 '||E2.ENAME 결과
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO(+)
ORDER BY E1.MGR;
SEMI-JOIN
- IN, EXISTS 연산자를 이용해 서브 쿼리에 있는 데이터에 대해서만 메인쿼리에서 추출하는 조인 방법
 --IN은 NULL값 취급x
--부서정보를 모두 가져오는데, 사원정보에 존재하는 부서정보만 가져오세요.
SELECT * FROM DEPT B
WHERE EXISTS ( SELECT * FROM EMP E WHERE E.DEPTNO = B.DEPTNO) ;

--사원정보를 모두 가져오는데, 부서정보에 존재하는 사원정보만 가져오세요.
--[SEMI-JOIN_EXISTS]
SELECT * FROM EMP E
WHERE EXISTS (SELECT * FROM DEPT B WHERE B.DEPTNO = E.DEPTNO);
--[SEMI-JOIN_IN]
SELECT * FROM EMP E
WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT);



--[SEMI-JOIN_NOT EXISTS]
SELECT * FROM EMP E
WHERE NOT EXISTS (SELECT * FROM DEPT B WHERE B.DEPTNO = E.DEPTNO);
--[SEMI-JOIN_NOT IN] 
SELECT * FROM EMP E
WHERE NVL(DEPTNO,0) NOT IN (SELECT DEPTNO FROM DEPT);  --IN은 NULL값 취급x
ANTI-JOIN
- NOT IN, NOT EXISTS연산자를 이용해 서브쿼리에 없는 데이터만 메인 쿼리에서 추출하는 조인 방법
 
CATASIAN PRODUCT
- 조인 조건이 없는 조인
- 컬럼은 해당 테이블의 컬럼을 모두 합한 갯수만큼
- 행(줄)은 해당 테이블의 행(줄) 수를 모두 곱한 갯수만큼
 
**ANSI(미국표준연구소) Join (표준 조인)
- 다른 DBMS와의 호환성을 위해서는 ANSI조인을 사용하는 것이 좋다.
ANSI Inner Join (동등조인과 동일하게 처리)
- SELECT [테이블별칭 또는 테이블명.] 컬럼명1, ...
FROM 왼쪽기준이되는테이블명 [테이블별칭]
[INNER] JOIN 오른쪽기준이되는테이블명 [테이블별칭]
ON 조인 조건
WHERE 조인조건 이외의 조건 기술;

--여러 개의 JOIN절이 존재할 경우 JOIN절마다 아래에 반드시 ON절이 존재해야 한다.
--[ANSI Join]
SELECT ENAME, DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE ENAME = 'SMITH';

--->INNER JOIN
SELECT ENAME, DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND ENAME = 'SMITH';
USING을 이용한 JOIN조건 지정, ON대신 사용가능.
- 반드시 조언하는 테이블에 동일한 컬럼이 존재해야 한다.
- 반드시 SELECT절의 컬럼이 *(전체)인 경우만 가능
- USING을 사용하는 경우, 해당 컬럼이 맨 앞에 딱 한 번만 표현된다.
SELECT * (모든컬럼)
- USING( 컬럼명 ) - ()생략불가
-> ON 테이블1의 컬럼명 = 테이블2의 컬럼명



--[ANSI JOIN]
SELECT * FROM TEST1 T1
JOIN TEST2 T2
ON T1.ID = T2.ID;

-->[INNER JOIN]
SELECT * 
FROM TEST1 T1, TEST2 T2 
WHERE T1.ID = T2.ID;

-->[USING]
SELECT * 
FROM TEST1 T1 
JOIN TEST2 
T2 USING(ID);
디그리 = 컬럼갯수
카디너리티 = 행수
 

 

외부조인(OUTER JOIN)

: (=A 또는 B 또는 합집합)
- 특정 테이블의 모든 데이터를 기준으로 다른 테이블의 정보를 추출 (다른 테이블에 값이 없어도 출력됨)
OUTER JOIN
: 2개 이상의 테이블이 조인될 때 어느 한쪽 테이블엔 데이터가 존재하는데, 다른 쪽 테이블에는 데이터가 존재하지 않는 경우에, 데이터가 누락되는 문제를 해결하기 위해 사용되는 기법

--(+) NULL값이 들어간 구조가 추가됨 
--하나의 조건에 존재하는 같은 컬럼에는 (+) 동시 사용 불가
ex) E.DEPTNO(+) = D.DEPTNO (ㅇ)
E.DEPTNO(+) = D.DEPTNO(+) ( x )
- 여러 개의 테이블을 조언하는 경우 아우터연산자는 동일한 테이블의 동일한 컬럼에 아우터 연산자를 연속하여 사용할 수 없다.
EX) E.DEPTNO(+) = D.DEPTNO AND E.DEPTNO(+) = S.DEPARTMENT_ID( x )
 E.DEPTNO(+) = D.DEPTNO AND E.DEPTNO = S.DEPARTMENT_ID (+)  (ㅇ)
--FULL OUTER에는 사용불가
--[OUTER JOIN] (+)
SELECT E.EMPNO, E.ENAME, D.DEPTNO, S.DEPARTMENT_NAME
FROM EMP E, DEPT D, DEPARTMENTS S
WHERE E.DEPTNO(+) = D.DEPTNO
AND E.DEPTNO = S.DEPARTMENT_ID(+);
LEFT OUTER JOIN
: FROM절의 테이블에 해당되는 값을 모두 표현하고,
그 뒤에 JOIN절에 해당하는 테이블의 값을 표현하는 방식.
해당 값이 없는 컬럼은 NULL처리함.
(LEFT OUTER JOIN, ANSI LEFT OUTER JOIN)
--[ANSI RIGHT/LEFT OUTER JOIN]
SELECT E.EMPNO, E.ENAME, D.DEPTNO, S.DEPARTMENT_NAME
FROM EMP E
RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
LEFT OUTER JOIN DEPARTMENTS S
ON E.DEPTNO = S.DEPARTMENT_ID;
RIGHT OUTER JOIN
: JOIN절에 해당하는 테이블의 값을 모두 표현하고,
그 뒤에 FROM절의 테이블에 해당되는 값을 표현하는 방식.
해당 값이 없는 컬럼은 NULL처리함.
(RIGHT OUTER JOIN, ANSI RIGHT OUTER JOIN)
FULL OUTER JOIN
: 조인할 두 테이블의 값을 모두 표현하고, 해당 값이 없는 컬럼은 NULL처리함.
- ANSI조건에만 가능
(ANSI FULL OUTER JOIN)

--동일컬럼명이 있을 경우 _N가 붙는다.
--[FULL OUTER JOIN]
SELECT E.EMPNO, E.ENAME, D.DEPTNO, S.DEPARTMENT_NAME
FROM EMP E
FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
FULL OUTER JOIN DEPARTMENTS S
ON E.DEPTNO = S.DEPARTMENT_ID;

 

반응형

'[ORACLE]' 카테고리의 다른 글

[ORACLE] SEQUENCE - CURRVAL, NEXTVAL  (0) 2024.01.22
[ORACLE] INDEX  (0) 2024.01.22
[ORACLE] SQL파일 export&import  (0) 2024.01.18
[ORACLE] Transaction - COMMIT, SAVEPOINT, ROLLBACK, VIEW  (0) 2024.01.18
[ORACLE] 제약조건 CONSTRAINT  (0) 2024.01.17

+ Recent posts