1. PARTITION 기능

- 대용량 테이블을 여러 개의 데이터 파일에 분리해 저장

- 논리적으로는 하나의 테이블이지만 여러 개의 데이터 파일에 (물리적으로)분산되어 저장됨

- 파티션은 각각의 파티션 별로 독립적으로 관리될 수 있음 => 파티션별로 백업 복구 가능, 파티션 전용 인덱스 생성 가능

- ORACLE DB의 논리적 관리 단위인 테이블 스페이스 간 이동 가능

- 데이터 조회 시 데이터 범위를 줄여서 성능 향상시킴


1) 파티션

RANGE PARTITION

 - 테이블 칼럼 중 데이터 값의 범위를 기준으로 파티션 진행 

 LIST PARTITION

 - 특정 값 기준으로 파티션 진행

 HASH PARTITION

 - DBMS가 내부적으로 해시함수를 적용하여 파티션 수행

 - DBMS가 알아서 분할하고 관리

COMPOSITE PARTITION

 - 범위와 해시를 복합적으로 사용하여 파티션 수행 

 - 여러 개의 파티션 기법을 조합하여 사용


2) 파티션 인덱스

- 인덱스 제공

GLOBAL INDEX

 - 여러 개의 파티션에서 하나의 인덱스 사용

LOCAL INDEX 

 - 해당 파티션 별로 각자의 인덱스 사용

PREFIXED INDEX 

 - 파티션 키를 사용해 인덱스 만듬 -> 파티션 키와 인덱스 키가 동일

NON PREFIXED INDEX 

 - 파티션키와 인덱스키가 다름

- GLOBAL PREFIXED INDEX / GLOBAL NON PREFIXED INDEX / LOCAL PREFIXED INDEX / LOCAL NON PREFIXED INDEX 이런 식인건데

 GLOBAL NON PREFIXED INDEX은 ORACLE이 지원 X 

1. 윈도우 함수

- 데이터웨어하우스에서 발전한 기능 -> 순위, 합계, 평균, 행 위치 등 조작 가능

 SELECT WINDOW_FUNCTION(ARGUMENTS)

OVER(PARTITION BY 칼럼 ORDER BY WINDOWING 절)

FROM 테이블명;

- 중첩해서 사용할 수 없음 / 서브쿼리로 사용 가능

- OVER 키워드 필수!

- 행과 행 간의 관계를 정의하기 위해 제공되는 함수 


* 윈도우 함수 구조

ARGUMENTS

 - 윈도우 함수에 따라서 0 ~ N개의 인수 설정 

PARTITION BY 

 - 전체 집합을 기준에 의해 소그룹으로 나눔 

ORDER BY

 - 어떤 항목에 대해 정렬. 어떤 항목에 대해 순위 지정할 지 기술 

WINDOWING

 - 행 기준의 범위.

 - ROW : 물리적 결과의 행 수 / RANGE : 논리적 값에 의한 범위 

PARTITION BY DEPTNO ORDER BY SAL -> 파티션 구분은 DEPTNO로 하지만 윈도우 함수에 사용할 범위는 SAL임

DEPTNO 파티션 안에서 SAL로 랭크 짓고, 집계하고 하는 것

* WINDOWING

ROWS

 - 부분집합인 윈도우 크기를 물리적 단위로 행의 집합을 지정

RANGE

 - 논리적 주소에 의해 행 집합을 지정 

BETWEEN ~ AND

 - 윈도우의 시작과 끝 위치 지정 

UNBOUNDED PRECEDING

 - 윈도우 시작 위치가 첫 번째 행임을 의미

UNBOUNDED FOLLOWING

 - 윈도우 마지막 위치가 마지막 햄임을 의미 

CURRENT ROW

 - 윈도우 시작 위치가 현재 행임을 의미

SELECT EMPNO, ENAME, SAL, SUM(SAL) OVER (ORDER BY SAL

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) TOTSAL FROM EMP;

시작이 첫 행부터 마지막이 끝 행 사이의 물리적 행을 SAL 기준으로 정렬해서 SUM해라

SELECT EMPNO, ENAME, SAL, SUM(SAL) OVER (ORDER BY SAL

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) TOTSAL FROM EMP;

시작이 첫 행부터 현재 행 사이의 물리적 행을 SAL 기준으로 정렬해서 SUM 해라

SELECT EMPNO, ENAME, SAL, SUM(SAL) OVER (ORDER BY SAL

ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) TOTSAL FROM EMP;

시작이 현재 행부터 마지막 행이 끝행 사이의 물리적 행을 SAL 기준으로 정렬해서 SUM 해라


RANGE UNBOUNDED PRECENFING : 현재 행 기준으로 파티션 내의 첫번째 행까지 범위 지정

ROWS BETWEEN 1 PRECENDING AND 1 FOLLOWING : 현재 행(위치)기준로 파티션 내에서 앞의 한 뒤의 한 을 묶음으로 지정(ROWS: 물리적 행)

RANGE BETWEEN 50 PRECENDING AND 150 FOLLOWING : 현재 행(값)기분으로 값 -50 값_150 범위 내 포함된 모든 행이 범위


2. 윈도우 함수의 종류

1) 순위 함수 (RANK FUNCTION)

- 특정 항목과 파티션에 대해 순위를 계산 

- 특정 범위 혹은 전체 데이터에 대한 순위를 계산

RANK

 - 동일한 순위는 동일한 값 부여

   순희 100 영희 100 철수 90 영수 80 => 순희,영희 다른 건수

->순희 1, 영희 1, 철수 3(앞에 2건), 영수 4(앞에 3건)

DENSE_RANK

 - 동일한 순위를 하나의 건수로 계산

 - 동순위 같은 숫자 부여, 차순위 숫자는 바로 다음 숫자

   순희 100 영희 100 철수 90 영수 80 => 순희,영희 하나 건수

->순희 1, 영희 1, 철수 2(앞에 1건), 영수 3(앞에 2건)

ROW_NUMBER

 - 동일한 순위에 대해 고유의 순위 부여   순희 100 영희 100 철수 90 영수 80

->순희 1, 영희 2, 철수 3, 영수 4 

  (순희, 영희에 대해 다른 순위 부여 방식 존재)



2) 집계 함수 (AGGREGATE FUNCTION)

SUM

 - 파티션별 윈도우 합계 계산

AVG

 - 파티션별 윈도우 평균 계산 

COUNT 

 - 파티션별 윈도우 행수 계산 

MAX, MIN 

 - 파티션별 최대값 최소값 계산 

 SELECT ENAME, SAL, SUM(SAL) OVER (PARTITION BY DEPTNO) FROM EMP;

 SELECT ENAME, SAL, SUM(SAL) 

OVER (PARTITION BY DEPTNO ORDER BY SAL RANGE UNBOUNED PRECENDING) FROM EMP; (현재행~첫째행 까지 누산)

SELECT ENAME, SAL, AVG(SAL) OVER (PARTITION BY DEPTNO ORDER BY SAL ROWS BETWEEN 1 PRECENDING AND 1 FOLLOWING) FROM EMP;

SELECT ENAME, SAL, COUNT(*) OVER (PARTITION BY DEPTNO ORDER BY SAL RANGE BETWEEN 50 PRECENDING AND 150 FOLLOWING) FROM EMP;

SELECT ENAME, SAL, MAX(SAL) OVER (PARTITION BY DEPTNO ORDER BY SAL ROWS BETWEEN 1 PRECENDING AND 1 FOLLOWING) FROM EMP;


3) 행 순서 관련 함수

- 상위 행의 값을 하위에 출력하거나 하위 행의 값을 상위 행에 출력할 수 있음

- 특정 위치의 행을 출력할 수 있음 (ARGUMENTS 에 설정 가능)

 FIRST_VALUE

 - 파티션에서 가장 처음 나오는 값 구함

 - MIN 함수 활용해 같은 결과 도출

 - 공동 등수 인정 X, 처음 나온 행만 처리(공동 등수 처리 시 세부 항목으로 정렬하기 위해 ORDER BY 사용) 

 LAST_VALUE

 - 파티션에서 가장 나중에 나오는 값 구함

 - MAX 함수 활용해 같은 결과 도출

 - 공동 등수 인정 X, 마지막에 나온 행만 처리(공동 등수 처리 시 세부 항목으로 정렬하기 위해 ORDER BY 사용) 

 LAG

 - 이전 및 몇 번째 행의 값 가져옴 (SQL SERVER에서 지원 X)

 - 기본값 : 1

 - ARGUMENT 3개 사용 가능

 - ISNULL, NVL 기능 함

 LAG(A, B, C)

 A : 값 가져올 컬럼

 B : 몇 번째 앞의 값 가져올 지 지정할 숫자

 C : 가져온 값이 NULL일 경우 반환할 값

 LEAD

 - 윈도우에서 특정 위치 행 가지고 옴 (SQL SERVER에서 지원 X)

 - 기본값 : 1

 - ARGUMENT 3개 사용 가능

 - ISNULL, NVL 기능 함

 LEAD(A, B, C)

 A : 값 가져올 컬럼

 B : 몇 번째 뒤의 값 가져올 지 지정할 숫자

 C : 가져온 값이 NULL일 경우 반환할 값



4) 그룹 내 비율 함수 

 RATIO_TO_REPORT

 - 파티션 내 전체 SUM(칼럼)에 대한 행 별 칼럼 값의 백분율을 소수점까지 조회

 - 결과값 범위 : 0 < 결과값 <= 1  /  RATIO의 합 = 1

 - SQL SERVER 지원 X

 PERCENT_RANK

 - 파티션에서 제일 먼저 나온 것을 0~ 제일 늦게 나온 것을 1로 하여 값이 아닌 행의 순서별 백분율 조회

- 결과값 범위 : 0 <= 결과값 <= 1  (석차별 백분율.. 등급제 나누는거 같은거 인듯)

 - SQL SERVER 지원 X 

CUME_DIST 

 - 파티션 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율 조회

 - 누적 분포상 위치를 0 ~ 1 사이의 값 가짐 30% / 55%(30+25) / 90%(30+25+35) / 100%(30+25+35+10)

 - SQL SERVER 지원 X 

 NTILE

 - 파티션별로 전체 건수를 ARGUMENT 값으로 N등분한 결과 조회

 - ARGUMENT 값이 3이면 3등분 하라는 것 (등분 안에 동일한 ROW가 들어가겠지.. 동비율)


1. 그룹함수

- 집계함수를 제외하고 ROLLUP, CUBE, GROUPING SETS


2. ROLLUP

- 소그룹간의 소계 계산. GROUP BY의 확장된 형태 

- GROUP BY 의 칼럼에 대하여 subTotal 만들어줌

- ROLLUP에 지정된 그룹핑 칼럼의 리스트는 소계를 생성하기 위해 사용

- 그룹 잡을 칼럼의 수가 N일 때 SubTotal은 N+1 LEVEL로 생성됨

- ROLLUP 인수는 계층구조! -> 인수의 순서 바뀌면 결과도 바뀌게 됨(먼저나오는 인수가 상위 계층)


SELECT DNAME, JOB COUNT(*) SUM(SAL) FROM EMP, DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO

GROUP BY ROLLUP (DNAME, JOB);


LEVEL 1 : 표준 집계. DNAME(첫번째 인자)으로 나눔

LEVEL 2 : DNAME(첫 인자) 별 JOB(두번째 인자) SubTotal 구함

LEVEL 3 : 총 합계

 LEVEL 2 DNAME별 JOB : 차장 3명 9000만원

 

 

 LEVEL 2 DNAME별 JOB : 대리 4명 9000만원 

 

 LEVEL1 DNAME : 영업 7명 18000만원


 

 

 LEVEL 2 DNAME별 JOB : 차장 5명 20000만원

 

 

 LEVEL 2 DNAME별 JOB : 대리 4명 12000만원

 

 LEVEL1 DNAME : 생산 9명 32000만원

   
   LEVEL 3 전부 합계 16명 50000만원

- 계층 내 정렬을 하려면 ORDER BY로 정렬


3. CUBE

- GROUP BY 항목들 간 다차원적인 소계 계산 (결합가능한 모든 값에 대하 집계 생성) 그러나 부하가 많음

- 표시된 인수들 간에는 평등한 관계라 인수의 순서는 중요하지 않음

- 결과에 대한 정렬이 필요할 시 ORDER BY 절에서 칼럼 명시해야 함

- 그룹 잡을 칼럼의 수가 N일 때 SubTotal은 2^N LEVEL로 생성됨


SELECT DEPTNO, JOB, SUM(SAL) FROM EMP GROUP BY CUBE(DEPTNO, JOB);

2^2레벨 -> 레벨 4까지의 SUBTOTAL 나온다는 것

LEVEL 1 전체 합계 11000만원

 

 

 

 LEVEL 2-2 JOB별 합계 차장 6000만원

 

 

 LEVEL 2-2 JOB별 합계 대리 5000만원

 

 

 LEVEL 2-1 DEPTNO별 합계 영업부 11000만원

 

 

 

 LEVEL 4  DEPTNO별 JOB별 합계 영업_차장 3000만원

 

 

 LEVEL 4  DEPTNO별 JOB별 합계 영업_대리 2500만원

 

 

 LEVEL 4  DEPTNO별 JOB별 합계 생산_차장 3000만원

 

 

 LEVEL 4  DEPTNO별 JOB별 합계 생산_대리 2500만원


4. GROUPING SETS

- 특정항목에 대한 소계 계산-> 원하는 부분의 소계만 추출 가능

- GROUP BY에 나오는 칼럼의 순서와 상관없이 다양한 소계 생성

- 인자간 평등한 관계이며, 소계를 모두 개별적으로 처리

- UNION ALL을 사용한 일반 그룹함수 사용 SQL과 같은 결과가 나옴


SELECT DEPNO, JOB, SUM(SAL) FROM EMP GROUP BY GROUPING SETS(DEPTNO, JOB);

 LEVEL 1 JOB별 합계 차장 6000만원

 LEVEL 1 JOB별 합계 대리 5000만원 

 LEVEL 1 DEPTNO별 합계 영업 6000만원

 LEVEL 1 DEPTNO별 합계 생산 5000만원 


5. GROUPING

- ROLLUP CUBE GROUPING SET에서 생성되는 합계 값을 구분하기 위해 만들어진 함수

- ROLLUP 이나 CUBE 등으로 소계가 계산된 결과에는 GROUPING(칼럼명) = 1이 반환, 그 외의 결과는 0 반환

- GROUPING의 반환 값을 DECODE나 CASE 문으로 식별해서 SELECT문으로 필드에 원하는 문자열 지정할 수 있음


SELECT 

CASE GROUPING(DNAME) WHEN 1 THEN 'DEPARTMENT TATAL' ELSE DNAEM END AS DNAME, 

CASE GROUPING(JOB) WHEN 1 THEN 'JOB TOTAL' ELSE JOB END AS JOB, COUNT(*), SUM(SAL)

FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO

GROUP BY ROLLUP(DNAME, JOB);


SELECT

 DECODE(GROUPING(DNAME), 1, 'DEPARTMENT TOTAL', DNAME) AS DNAME,

 DECODE(GROUPIN(JOB), 1, 'JOB TOTAL', JOB) AS JOB, COUNT(*), SUM(SAL)

FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO

GROUP BY GROUPING SETS (DNAME, JOB);


Single Row 서브쿼리

단일 행 서브쿼리

 - 서브 쿼리 실행 결과가 단 한 행만 조회

 - 단일 행 비교 연산자 사용 ( =, <, <=, >, >=, <>)

Multi Row 서브쿼리

다중 행 서브쿼리

 - 서브쿼리 실행 결과가 여러 개의 행 조회

 - 다중 행 비교 연산자 사용 (IN, ANY(=SOME), ALL, EXIST)

Multi Column 서브쿼리

다중 칼럼 서브쿼리

 - 서브쿼리 실행 결과로 여러 칼럼 반환.

 - 메인 쿼리 조건절에 여러 칼럼을 동시에 비교 가능


1. MAIN QUERY와 SUB QUERY 

- subquery : 하나의 SQL문 안에 포함되어 있는 또다른 SQL문. 알려지지 않은 기준을 이용한 "검색"을 위해 사용

메인쿼리에 종속적인 관계를 가짐


* 동작하는 방식에 따른 서브쿼리 분류

UN-CORRELATED

서브쿼리(비연관)

 - 서브쿼리가 메인쿼리 칼럼을 가지고 있지 않은 형태의 서브쿼리
 - 메인쿼리에 값을 제공하기 위한 목적으로 사용

CORRELATED

서브쿼리(연관)

 - 서브쿼리가 메인쿼리 칼럼을 가지고 있는 형태의 서브쿼리

 - 메인쿼리가 먼제 수행되어 일기혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하는 목적으로 사용

* 반환되는 데이터의 형태에 따른 서브쿼리 분류

Single Row 서브쿼리

단일 행 서브쿼리

 - 서브 쿼리 실행 결과가 단 한 행만 조회

 - 단일 행 비교 연산자 사용 ( =, <, <=, >, >=, <>)

Multi Row 서브쿼리

다중 행 서브쿼리

 - 서브쿼리 실행 결과가 여러 개의 행 조회

 - 다중 행 비교 연산자 사용 (IN, ANY(=SOME), ALL, EXIST)

Multi Column 서브쿼리

다중 칼럼 서브쿼리

 - 서브쿼리 실행 결과로 여러 칼럼 반환.

 - 메인 쿼리 조건절에 여러 칼럼을 동시에 비교 가능


1) 단일 행 서브쿼리 

- 서브쿼리가 단일행 비교연산자( =, <, > ,<> 등)와 함께 사용되고, 시행 결과 건수가 1건 이하일 경우

SELECT PLAYER_NAME,PLAYER_AGE FROM PLAYER WHERE TEAM_ID=(한 건만 조회될 수 있는 SELECT문);

SELECT PLAYER_NAME,PLAYER_AGE FROM PLAYER WHERE TEAM_ID=(SELECT TEAM_ID FROM PLAYER WHERE PLAYER_NAME="기성용");

SELECT PLAYER_NAME,PLAYER_AGE FROM PLAYER WHERE PLAYER_HEIGHT>=(SELECT AVG(PLAYER_HEIGHT) FROM PLAYER);


2) 다중 행 서브쿼리

- 서브쿼리의 결과가 2건 이상 반환되어 반드시 다중행 비교연산자 (IN, ALL ,ANY, SOME, EXIST)와 사용해야 하는 서브쿼리

IN

 - 서브쿼리 결과 중 하나만 동일하면 참 (Multiple OR 조건)

ALL

 - 메인쿼리와 서브쿼리의 결과가 모두 동일하면 참

 - 메인쿼리는 서브쿼리의 모든 결과 값을 만족

   ">" 사용했다면 서브쿼리의 모든 결과 값을 다 만족해야 하므로 최대값을 반환 / "<"사용했다면 최소값 반환

ANY (= SOME)

 - 서브쿼리 결과 중 하나 이상 동일하면 참

   "<" 사용했다면 서브쿼리 모든 결과 값 중 하나라도 만족하면 되므로 최대값 직전 값 까지 참 / ">"사용했다면 최소값 직후 값 부터 참

EXIST

 - 서브쿼리 결과가 하나라도 존재하면 참 -> 참 거짓 반환됨

 - 만족하는 것이 여러 건이더라도 1건만 찾으면 더 이상 검색하지 않음


3) 다중 칼럼 서브쿼리

- 서브쿼리 결과로 여러 개의 칼럼이 반환되어 메인쿼리의 조건과 동시에 비교 되는 것

SELECT TEAM_ID, PLAYER_NAME, HEIGHT FROM PLAYER 

WHERE (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, HEIGHT FROM PLAYER GROUP BY TEAM_ID) ;

=> 서브쿼리의 결과값으로 두 개의 칼럼을 반환, 그것이 WHERE절의 조건 칼럼과 위치와 수 일치

- SQL SERVER에서는 지원 안함


4) 연관 서브쿼리

- 서브쿼리 내에 메인쿼리 칼럼이 사용된 서브쿼리

- 메인쿼리에서 데이터를 받아서 서브쿼리를 실행

SELECT ENAME, SAL FROM EMP WHERE EMP.DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO=EMP.DEPTNO);


5) 스칼라 서브쿼리

- SELECT절에서 사용하는 서브쿼리

- 한 행과 한 칼럼만 반환

- 칼럼을 쓸 수 있는 대부분의 곳에서 사용(칼럼으로 사용!)

SELECT ENAME, SAL, (SELECT AVG(SAL) FROM EMP) FROM EMP WHERE EMPNO IN (SELECT EMPNO FROM EMP WHERE SAL>=AVG(SAL));

스칼라 서브쿼리                                                            다중행 서브쿼리


6) 인라인뷰

- FROM절에 사용하는 서브쿼리

- FROM절에는 원래 테이블명이 오게 되어있음! 즉 FROM절 뒤에 오는 인라인뷰는 동적 테이블 생성하는 것!

- SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰

- ORDER BY 절 사용 가능 (TOP-N쿼리 : 인라인뷰에서 먼저 정렬 수행 후 정렬된 결과 중 일부 데이터 추출하는 것_ROWNUM...)

SELECT ENAME, EMPNO FROM (SELECT ENAME, EMPNO FROM EMP WHERE EMPNO BETWEEN 1000 AND 2000) WHERE SAL = AVG(SAL);


7) 그 밖의 위치에 존재하는 서브쿼리

- HAVING절에서 그룹핑된 결과에 대해 부가적인 조건을 주는 서브쿼리

- UPDATE문의 SET절에서 사용하는 서브쿼리

- INSERT문의 VALUES 절에서 사용하는 서브쿼리


2. 뷰

- 실제 데이터를 가지고 있지 않은 가상 테이블

- 질의에서 뷰를 사용하면 뷰 정의를 참조해서 DBMS가 내부적으로 질의를 재작성하여 질의 수행

- DDL로 뷰 생성, 삭제 가능하고 ALTER은 안됨

1. 계층형 질의

- 계층형 데이터 : 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터

엔터티를 순환관계 데이터 모델로 설계할 경우 발생


1) 계층형 질의

 SELECT ... FROM 테이블

 WHERE 조건 1 AND 조건 2

 START WITH 조건 3

 CONNECT BY [NOCYCLE] 조건 4 AND 조건 5

 [ORDER SIBLINGS BY ...]

 - START WITH : 계층 구조 전개의 시작 위치 지정 "루트 데이터 지정"

 - CONNECT BY : 트리 형태의 구조로 질의 수행. "자식 데이터 지정"

 - PRIOR : CONNECT BY 절에 사용. "현재 읽은 칼럼 지정"

   -- 순방향 전개 : PRIOR 자식 = 부모 / 역방향 전개 : PRIOR 부모 = 자식

 - NOCYCLE : 이미 나타났던 데이터가 전개 중 다시 나타나면 그 이후 데이터 전개하지 않음

 - ORDER SIBLING BY : 형제 노드 사이에서 정렬 수행

 - WHERE : 모든 전개 수행 후 지정된 조건 만족하는 데이터만 추출


- 순방향 전개 : PRIOR 자식 = 부모 형태! 부모에서 자식 (부모->자식)으로 데이터가 흐름 (위에서 아래로)

- 역방향 전개 : PRIOR 부모 = 자식 형태! 자식에서 부모 (자식->부모)로 데이터가 흐름 (아래에서 위로)


2) 계층형 질의에서 사용하는 함수

(1) LPAD

- 계층형 조회 결과를 명확히 보기위해 "결과 데이터를 들여쓰는 함수"

- LPAD(' ', 4(임의의 수)*(LEVEL-1)) ROOT이면 LEVEL이 1 이므로 LPAD(' ', 0) 임

LEVEL이 3이면 LPAD(' ', 8) 이므로 공백으로 8칸 띄워짐


LEVEL

 - 검색 항목의 깊이

 - 루트 데이터 : 1 그 하위 데이터일수록 +1 (리프데이터까지 +1 함) 

CONNECT_BY_ISLEAF

 - 전개 과정에서 해당 데이터가 리프 데이터이면 1, 아니면 0

CONNECT_BY_ISCYCLE

 - 전개 과정에서 자식을 갖는데 해당 데이터가 조상으로 존재하명 1, 그렇지 않으면 0

 - 조상 : 자신으로부터 루트까지 경로에 존재하는 데이터! (자식 데이터가 있는 것!)

 - CYCLE 옵션을 사용했을 때만 사용

CONNECT_BY_ROOT

 - 가장 취상위 값 표시

CONNECT_BY_PATH

 - 전체 전개 경로 표시 

NOCYCLE

 - 순환구조 발생지점까지만 전개

MAX(LEVEL)

 - 최대 계층 수 구함. 즉 계층형 구조의 LEAF NODE 계층값 구함 

2. 셀프 조인

- 동일 테이블 사이의 조인

-  FROM 절에 동일 테이블이 두 번 이상 등장

- 식별을 위해 테이블 별칭 사용, 어느 테이블 칼럼인지 식별


SELECT ALIAS명1.칼럼명, ALIAS명2.칼럼명,... FROM 테이블1 ALIAS명1, 테이블2 ALIAS명2 WHERE ALIAS명1.칼럼명2 = ALIAS명2.칼럼명1;


- 같은 테이블이지만 두 개의 서로 다은 테이블을 사용하는 것 처럼 사용하는 것

- 보통 LEFT OUTER JOIN과 많이 쓰이는 듯


1. 조인(JOIN)

1) EQUI (등가) 조인 (교집합)

- 조인! 교집합을 만드는 것이 기본

- WHERE

- 두 개의 테이블 간에 일치하는 것을 조인

- “ = ”을 사용해서 두 개의 테이블을 연결

- 조인문에 추가조건 및 정렬을 할 수 있음

SELECT * FROM EMP, DEPT

WHERE EMP.DEPNO = DEPT.DEPNO;

 

2) Non-EQUI (비등가) 조인

- >, <, >=, <= 등 비교연산자 사용하는 조인. “ = ”사용 아님! (요건 조인)

- Non-EQUI 조인은 정확하게 일치하지 않는 것을 조인하는 것

 

3 FROM절 조인

(1) INNER JOIN

- JOIN 조건에서 동일한 값이 있는 행만 반환

- FROM절 안에 INNER JOIN구로 테이블을 서술하고 ON구로 조인 조건을 서술

SELECT * FROM EMP INNER JOIN DEPT

ON EMP.DEPNO = DEPT.DEPTNO;

- DEPT 테이블과 EMP테이블 전체를 읽은 다음(TABLE ACCESS FULL) 해시함수를 사용해서 해시 조인을 함

- 해시함수는 테이블을 해시 메모리에 적재한 후 해시함수로써 연결하는 방법

- 해시 조인은 EQUI 조인만 사용 가능

 

(2) NATURAL JOIN

- 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행

- 추가로 USING 조건절, ON 조건절, WHERE 절에서 JOIN 조건을 정의할 수 없음

- JOIN이 되는 테이블의 데이터 성격(도메인)과 칼럼명 등이 동일해야 하는 제약 조건

SELECT DEPTNO, EMPNO, ENAME, DNAME FROM EMP

NATURAL JOIN DEPT;

 

(3) USING 조건절

- FROM 절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있음

SELECT * FROM DEPT JOIN DEPT_TEMP

USING (DEPTNO);

 

(4) ON 조건절

- JOIN 서술부(ON)와 비 JOIN 서술부(WHERE)를 분리 -> ON 조건절과 WHERE 검색 조건은 충돌 없이 사용 가능

- 임의의 JOIN 조건을 지정하거나, 이름이 다른 칼럼명을 JOIN 조건으로 사용하거나, JOIN 칼럼 명시하기 위해 사용

SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME FROM EMP E

JOIN DEPT D ON (E.DEPTNO = D.DEPTNO) WHERE E.DEPTNO = 30;

- 검색 조건 목적인 경우는 WHERE 절을 사용 (ON 조건절에 JOIN 조건 외에도 데이터 검색 조건을 추가는 가능)

 

(5) OUTER JOIN

- 두 개의 테이블 간에 교집합을 조회(EQUI JOIN)하고 한쪽 테이블에만 있는 데이터도 포함시켜 조회

- 조인 수행 시 한쪽 테이블에 해당하는 데이터를 먼저 읽어 들이고 나중 테이블에서 JOIN대상 데이터를 읽어옴

- Oracle DB에서는 “(+)” 기호 사용 가능

 

LEFT OUTER JOIN

- 두 개의 테이블에서 같은 것을 조회하고 왼쪽 테이블에만 있는 것을 포함해서 조회

SELECT * FROM DEPT LEFT OUTER JOIN EMP

ON EMP.DEPTNO = DEPT.DEPTNO ;

SELECT * FROM DEPT, EMP

WHERE EMP.DEPTNO (+) = DEPT.DEPTNO;

- (+)를 사용한 OUTER JOIN(+) 위치는 LEFT에 있는 DEPT의 반대편에 붙어있음

 

RIGHT OUTER JOIN

- 두 개의 테이블에서 같은 것을 조회하고 오른쪽 테이블에만 있는 것을 포함해서 조회

SELECT * FROM DEPT RIGHT OUTER JOIN EMP

ON EMP.DEPTNO = DEPT.DEPTNO ;

SELECT * FROM DEPT, EMP

WHERE EMP.DEPTNO = DEPT.DEPTNO (+);

- (+)를 사용한 OUTER JOIN(+) 위치는 RIGHT에 있는 EMP의 반대편에 붙어있음

 

FULL OUTER JOIN

- LEFT OUTER JOIN RIGHT OUTER JOIN을 합친 형태

SELECT * FROM DEPT FULL OUTER JOIN EMP

ON EMP.DEPTNO = DEPT.DEPTNO;

 

(5) CROSS JOIN

- 조인 조건 구 없이 2 개의 테이블을 하나로 조인

- 조인 구가 없기 때문에 카테시안 곱(교차곱 : 두 테이블의 모든 데이터를 조합하여 연산)이 발생

-> 테이블 1의 카디널리티 * 테이블 2의 카디널리티 = CROSS JOIN의 카디널리티

- FROM 절에 CROSS JOIN 구를 사용함

SELECT * FROM EMP CROSS JOIN DEPT;

 

2. 집합연산자

- 두 개 이상의 테이블에서 조인 사용하지 않고 연관된 테이블 조회하는 방법

- 여러 개의 질의 결과를 연결하여 하나로 결합하는 것

 

(1) UNION

- 두 개의 테이블을 합집합 하는 연산 -> 중복된 데이터 제거! (합집합은 (집합A+집합B)-AB의 교집합)

- 두 개의 테이블을 하나로 합치되, 두 테이블의 칼럼수, 칼럼의 데이터 형식 모두 일치해야 함

- 중복된 데이터를 제거하므로 정렬(SORT)과정이 발생

SELECT DEPTNO FROM EMP

UNION

SELECT DEPTNO FROM DEPT;

 

(2) UNION ALL

- 두 개의 테이블을 그냥(중복 제거, 정렬 없이) 하나로 합치는 것 -> 단순히 결과만 합친 꼴

- 일반적으로 여러 질의 결과가 상호 배타적인 경우 많이 사용

SELECT DEPTNO FROM EMP

UNION ALL

SELECT DEPTNO FROM DEPT;

 

(3) MINUS / EXCEPT

- 두 개의 테이블에서 차집합을 만드는 연산

- 먼저 쓴 SELECT 문에는 있고 뒤에 쓰는 SELECT 문에는 없는 집합을 조회하는 것

- MY-SQL에서는 MINUS와 동일한 연산이 EXCEPT

SELECT DEPTNO FROM EMP

MINUS

SELECT DEPTNO FROM DEPT;

 

(4) INTERSECT 연산

- 두 개의 테이블에서 교집합을 조회하는 연산

SELECT DEPTNO FROM EMP

INTERSECT

SELECT DEPTNO FROM DEPT;

**NATURAL JOIN / JOIN USING

+ Recent posts