개발자 끄적끄적

다중행 서브쿼리, 스칼라, 연관 커리, 그룹 함수, 윈도우 함수 본문

MySQL

다중행 서브쿼리, 스칼라, 연관 커리, 그룹 함수, 윈도우 함수

햏치 2023. 3. 8. 00:32

<다중 행(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 : 파티션 키와 인덱스 키가 다르다