0707 - SQL GENERATED / Top-N-Query

이진성·2021년 7월 7일
0

#GENERATED

  • GENERATED - 테이블을 생성할때 컬럼값을 자동 증가시키는 컬럼 정의
    - ORACLE 12C Ver. 부터 생긴 기능!
    - 12c 이전에는 Sequence 객체를 생성하여서 해당 컬럼에 값을 생성했었다.

  • 기본문법
GENERATED [ALWAYS | BY DEFAULT [ ON NULL ] ] 
	AS IDENTITY [ (identity options) ]

1. GENERATED ALWAYS
- 무조건 오라클이 생성

2. GENERATED BY DEFAULT
- 오라클이 생성하는데, 내가 넣는 값도 인정한다.
- 단, NULL이 포함되면 오류가 발생!

3. GENERATED BY DEFAULT ON NULL
- 오라클이 생성하는데, 내가 넣는 값도 인정한다.
- 단, NULL이 포함되면 오라클이 값을 지정한다.

FULL SYNTAX

CREATE TABLE t (
    ID NUMBER 
        GENERATED ALWAYS AS IDENTITY
            START WITH 1000
            INCREMENT BY 1,
    text VARCHAR2(50)
);

#TOP-N-QUERY

  • 상위 N 개의 데이터(행)을 추출하는 쿼리

ANSI 표준 SQL 문법

[ OFFSET offset { ROW | ROWS } ]
[ 
  FETCH 
    { FIRST | NEXT } 
        [ { rowcount | percent PERCENT } ]
    { ROW | ROWS } 
    { ONLY | WITH TIES } 
] 

사용 예

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST ROW ONLY;

FETCH FIRST 옵션

-- 가장 최 상단의 행만 출력
FETCH FIRST ROW ONLY;
-
-- 가장 최상단의 행만 출력하되, 동일값이 있으면 같이 출력 ex) 100, 100, 99, 98... => 100이 2개 출력
FETCH FIRST ROW WITH TIES; 
-
FETCH FIRST ROWS ONLY;
-
-- 가장 최 상단(첫번째행)의 데이터를 출력하되, 같은값이 있다면 같이 출력하라
FETCH FIRST ROWS WITH TIES; 
-
-- 처음부터 5개의 행만 출력하라
FETCH FIRST 5 ROWS ONLY; 
-
-- 처음부터 5개의 행만 출력하되, 동점이 있다면 같이 출력
FETCH FIRST 5 ROWS WITH TIES; 
-
-- 전체 데이터 중에서 전체 데이터의 21% 만 출력하라
FETCH FIRST 21 PERCENT ROWS ONLY; 
-
-- 전체 데이터 중에서 21% 만 출력하되, 동점이 있다면 같이 출력하라
FETCH FIRST 21 PERCENT ROWS WITH TIES; 

FETCH NEXT 옵션

-- * 위의 FETCH FIRST와 결과는 동일하다!
-
-- 최상단 행 3개를 출력
FETCH NEXT 3 ROWS ONLY; 
-
-- * OFFSET은 0부터 시작 
-
-- 0(첫)번째 행부터 3번째 행까지 출력
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;
-
-- ROW와 ROWS의 단수/복수의 차이점은 존재하지 않는다. 결과값이 같음
OFFSET 0 ROW FETCH NEXT 3 ROWS ONLY; 
-
OFFSET 0 ROW FETCH NEXT 3 ROW ONLY;
-
-- 오프셋 4번 위치 즉, 5번째 행부터 4개의 행을 출력
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY; 
-
-- 오프셋 0번 위치 즉, 1번째 행부터 3개의 행을 출력하되, 동점도 같이 출력하라.???
OFFSET 0 ROWS FETCH NEXT 3 ROWS WITH TIES; 
-
-- 오프셋 4번 위치 즉, 5번째 행부터 20% 행을 출력
OFFSET 4 ROWS FETCH NEXT 20 PERCENT ROWS ONLY; 

0개의 댓글