개발자 끄적끄적
다중행 서브쿼리, 스칼라, 연관 커리, 그룹 함수, 윈도우 함수 본문
<다중 행(Multi row) Subquery)>
- 서브쿼리의 결과가 여러 개의 행을 반환하는 것으로 다중 행 연산자를 사용해야 한다
1. IN(Subquery)
- Main query의 비교조건이 Subquery의 결과 중 하나만 동일하면 참이 된다
2. ALL(Subquery)
- Main query와 Subquery의 결과가 모두 동일하면 참이 된다
3. ANY(Subquery)
- Main query의 비교조건이 Subquery의 결과 중 하나 이상 동일하면 참이 된다
4. EXISTS(Subquery)
- Main query와 Subquery의 결과가 하나라도 존재하면 참이 된다
- 즉, 어떤 데이터 존재 여부를 확인하는 것으로 결과는 참과 거짓이 반환된다
<스칼라(Scala) Subqeury>
- 스칼라 Subquery는 반드시 한 행과 한 칼럼만 반환하는 서브쿼리이다
- 만약 여러 행이 반환되면 오류가 발행한다
<연관(Correlated) Subquery>
- Subquery 내에서 Main Query 내의 칼럼을 사용하는 것을 의미한다
<그룹함수>
1. ROLLUP
- ROLLUP은 GROUP BY의 칼럼에 대해서 Subtotal을 만들어 준다
- ROLLUP을 할 때 GROUP BY구에 칼럼이 두 개 이상 오면 순서에 따라서 결과가 달라진다
- DECODE문은 전체합계를 조회할 때 '전체 합계'라는 문자를 출력하기 위해서 사용된다
- 부서별, 직업별 ROLLUP을 실행하면 부서별 합계, 직업별 합계, 전체합계가 모두 조회된다
- ROLLUP으로 실행되는 칼럼별로 Subtotal을 만들어 준다
<GROUPING 함수>
- ROULLUP, CUBE, GROUPING SETS에서 생성되는 합계값을 구분하기 위해서 만들어진 함수이다
- 예를 들어 소계, 합계 등이 계산되면 GROUPING 함수는 1을 반환하고 그렇지 않으면 0을 반환해서 합계값을 식별할 수 있다
<GROUPING SETS 함수>
- GROUP BY에 나오는 칼럼의 순서와 관계없이 다양한 소계를 만들 수 있다
- GROUP BY에 나오는 칼럼의 순서와 관계없이 개별적으로 모두 처리한다
<CUBE 함수>
- CUBE 함수에 제시한 칼럼에 대해서 결합 가능한 모든 집계를 계산한다
- 다차원 집계를 제공하여 다양하게 데이터를 분석할 수 있게 한다
- 조합할 수 있는 경우의 수가 모두 조합되는 것이다
<윈도우 함수>
- 윈도우 함수는 행과 행 간의 관계를 정의하기 위해서 제공되는 함수이다
- 윈도우 함수를 사용해서 순위, 합계, 평균, 행 위치 등을 조작할 수 있다
ex) SELECT WINDOW_FUNCTION(ARGUMENTS)
OVER(PARTITION BY 칼럼
ORDER BY WINDOWING절)
FROM 테이블명;
<윈도우 함수 구조>
1. ARGUMENTS(인수) : 윈도우 함수에 따라서 0~N개의 인수를 설정한다
2. PARTITION BY : 전체 집합을 기준에 의해 소그룹으로 나눈다
3. ORDER BY : 어떤 항목에 대해서 정렬한다
4. WINDOWING
- 행 기준의 범위를 정한다
- ROWS는 물리적 결과의 행 수 이고 RANGE는 논리적 값에 의한 범위이다
<WINDOWING>
1. ROWS : 부분집합인 윈도우 크기를 물리적 단위로 행의 집합을 지정한다
2. RANGE : 논리적인 주소에 의해 행 집합을 지정한다
3. BETWEEN~AND : 윈도우의 시작과 끝의 위치를 지정한다
4. UNBOUNDED PRECEDING : 윈도우의 시작 위치가 첫 번째 행임을 의미한다
5. UNBOUNDED FOLLOWING : 윈도우 마지막 위치가 마지막 행임을 의미한다
6. CURRENT ROW : 윈도우 시작 위치가 현재 행임을 의미한다
<순위 함수(RANK FUNCTION)>
- 윈도우 함수는 특정 항목과 파티션에 대해서 순위를 계산할 슁 ㅆ는 함수를 제공한다
- 순위 함수는 RANK, DENSE_RANK, ROW_NUMBER 함수 있다
<순위(RANK) 관련 윈도우 함수>
1. RANK
- 특정항목 및 파티션에 대해서 순위를 계산한다
- 동일한 순위는 동일한 값이 부여된다
2. DENSE_RANK
- 동일한 순위를 하나의 건수로 계산한다
3. ROW_NUMBER
- 동일한 순위에 대해서 고유의 순위를 부여한다
ex_1) RANK() OVER(ORDER BY SAL DESC)는 SAL로 등수를 계산하고 내림차순으로 조회하게 한다
ex_2) RANK() OVER(PARTITION BY JOB ORDER BY SAL DESC)는 JOB으로 파티션을 만들고 JOB별 순위를 조회하게 한다
<행 순서 관련 함수>
- 행 순서 관련 함수는 상위 행의 값을 하위에 출력하거나 하위 행의 값을 상위 행에 출력할 수 있다
- 특정 위치의 행을 출력할 수 있다
<행 순서 관련 윈도우 함수>
1. FIRST_VALUE
- 파티션에서 가장 처음에 나오는 값을 구한다
- MIN함수를 사용해서 같은 결과를 구할 수 있다
2. LAST_VALUE
- 파티션에서 가장 나중에 나오는 값을 구한다
- MAX 함수를 사용해서 같은 결과를 구할 수 있다
3. LAG
- 이전 행을 가지고 온다
4. LEAD
- 윈도우에서 특정 위치의 행을 가지고 온다
- 기본값은 1이다
<비율 관련 함수>
- 누적 백분율, 순서 백분율, 파티션을 N분으로 분할한 결과 등을 조회할 수 있다
<비율 관련 윈도우 함수>
1. CUME_DIST
- 파티션 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 조회한다
- 누적 분포상에 위치를 0~1 사이의 값을 가진다
2. PERCENT_RANK
- 파티션에서 제일 먼저 나온 것을 0으로 제일 늦게 나온 것을 1로 하여 값이 아닌 행의 순서별 백분율을 조회한다
3. NTILE(N)
- 파티션별로 전체 건수를 ARGUMENT 값으로 N 등분한 결과를 조회한다
4. RATIO_TO_REPORT
- 파티션 내에 전체 SUM(칼럼)에 대한 행 별 칼럼값의 백분율을 소수점까지 조회한다
<테이블 파티션(TABLE PARTITION)>
1. PARTITION 기능
- 파티션은 대용량의 테이블을 여러 개의 데이터 파일에 분리해서 저장한다
- 테이블의 데이터가 물리적으로 분리된 데이터 파일에 저장되면 입력, 수정, 삭제, 조회 성능이 향상된다
- 파티션은 각각의 파티션 별로 독립적으로 관리될 수 있다
즉, 파티션 별로 백업하고 복구가 가능하면 파티션 전용 인덱스 생성도 가능하다
- 파티션은 ORACLE 데이터베이스의 논리적 관리 단위인 테이블 스페이스 간에 이동이 가능하다
- 데이터를 조회할 때 데이터의 범위를 줄여서 성능을 향상시킨다
2. RANGE PARTITION
- 테이블의 칼럼 중에서 '값의 범위'를 기준으로 여러 개의 파티션으로 데이터를 나누어 저장하는 것이다
<LIST PARTITION>
- LIST PARTITION은 '특정 값'을 기준으로 분할하는 방법이다
<HASH PARTITION>
- HASH PARTITION은 데이터베이스 관리 시스템이 내부적으로 해시 함수를 사용해서 데이터를 분할한다
- 결과적으로 데이터베이스 관리 시스템이 알아서 분할하고 관리하는 것이다
<파티션 인덱스>
- 파티션 인덱스는 4개의 유형의 인덱스만 제공한다
즉, 파티션 키를 사용해서 인덱스를 만드는 PREFIXED INDEX와 해당 파티션만 사용하는 LOCAL INDEX 등으로 나누어진다
- ORACLE 데이터베이스는 GLOBAL NON-PREFIXED를 지원하지 않는다
<파티션 인덱스(PARTITION INDEX)>
1. GLOBAL INDEX : 여러 개의 파티션에서 하나의 인덱스를 사용한다
2. LOCAL INDEX : 해당 파티션 별로 각자의 인덱스를 사용한다
3. PREFIXED INDEX : 파티션 키와 인덱스 키가 동일하다
4. NON PREFIXED INDEX : 파티션 키와 인덱스 키가 다르다
'MySQL' 카테고리의 다른 글
옵티마이저, index, nested loop, sort merge, hash join (0) | 2023.03.08 |
---|---|
join, intersect, connect by, main query, sub query (0) | 2023.03.08 |
형변환, 내장형 함수, decode, case, inline view, top, with 구문 (0) | 2023.03.08 |