728x90
반응형
조인(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; |
728x90
반응형
'[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 |