기존 관계형 데이터베이스는 컬럼과 컬럼간의 연산, 비교, 집계 등은 쉬운 반면, 행과 행간의 관계를 정의하거나 비교, 연산하는 것은 하나의 SQL 문으로 처리하기 어렵다.
절차형 프로그램을 작성하거나, INLINE VIEW 를 이용하여 복잡한 SQL 문을 작성해야 했던 것을 부분적으로라도 행과 행간의 관계를 쉽게 정의하기 위해 사용하는 함수가윈도우 함수(WINDOW FUNCTION)이다.
SELECT WINDOW_FUNCTION (ARGUMENTS)
OVER ( [PARTITION BY 컬럼] [ORDER BY 절] [WINDOWING 절] )
FROM 테이블 명
예시
SELECT 상품분류코드
, AVG(상품가격) AS 상품가격
, COUNT(*) OVER(ORDER BY AVG(상품가격)
RANGE BETWEEN 10000 PRECEDING
AND 10000 FOLLOWING) AS 유사개수
FROM 상품
GROUP BY 상품분류코드;
유사개수 칼럼은 상품분류코드별 평균상품가격을 서로 비교하여 ~10000~+10000 사이에 존재하는 상품분류코드의 개수를 구한 것이다.
RANK 함수
이름 그대로 각 행의 순위를 보여주는 함수이며,ORDER BY 를 포함한 QUERY 문에서 특정 컬럼에 대한 순위를 구하는 함수이다.
DENSE_RANK 함수
DENSE_RANK 함수는 RANK 함수와 다르게 순서 있는 집합에서 각 행의 순위를 구하는 함수이다.
SELECT JOB, ENAME, SAL,
RANK() OVER ( ORDER BY SAL DESC ) RANK,
DENSE_RANK() OVER ( ORDER BY SAL DESC ) DENSE_RANK
FROM EMP ;
ROW_NUMBER 함수
동일한 값이라도 고유한 순위를 부여한다는 점이 RANK,DENSE_RANK와 다르다.
SELECT JOB, ENAME, SAL,
RANK( ) OVER (ORDER BY SAL DESC) RANK,
ROW_NUMBER() OVER (ORDER BY SAL DESC) ROW_NUMBER
FROM EMP;
FIRST_VALUE 함수
LAST_VALUE 함수
NTILE
LAG 함수
LAG 함수를 이용해 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있다.
즉 현재 읽혀진 데이터의 이전 값을 알아내는 함수
LEAD 함수
LEAD 함수를 이용해 파티션별 윈도우에서 이후 몇 번째 행의 값을 가져올 수 있다. 즉 이후 값을 알아내는 함수
그룹 함수의 형태
SUM OVER()
1) ROWS : 값이 같더라도 각 행씩 연산
2) RANGE : 같은 값의 경우 하나의 RANGE로 묶어서 동시 연산
A 시작점 정의
B 마지막 시점 정의
페이징 처리를 효과적으로 수행하기 위해 사용
전체 결과에서 특정 N개 추출 ex) 빌보드 차트 3
출력된 데이터 기준으로 행 번호 부여
절대적인 행 번호가 아닌 가상의 번호이므로 특정 행을 지정할 수 없음(=연산 불가)
→ ROWNUM 할당 전에 먼저 순서대로 데이터를 정렬한 뒤 ROWNUM을 부여 후 추출하는 것이 좋다.
첫 번째 행이 증가한 이후 할당되므로 >
연산 사용불가
ROWNUM 잘못된 사용
SELECT *
FROM EMP
WHERE ROWNUM > 1;
// 크다 조건 전달 불가
SELECT *
FROM EMP
WHERE ROWNUM = 4;
// 항상 불변하는 절대적 번호가 아니므로 '=' 연산자 단독전달불가
예제) EMP 테이블에서 급여가 높은 순서대로 상위 5명의 직원 정보 출력
SELECT EMPNO, ENAME, DEPTNO, SAL
FROM EMP
WHERE ROWNUM <= 5;
ORDER BY SAL DESC;
추출원리 : WHERE절에 의해 먼저 5개를 추출 뒤 이 결과가 집합에 대해 정렬 수행
** 해결 : 먼저 서브쿼리를 사용하여 SAL에 대해 내림차순 정렬을 해놓고 상위 5개 추출
SELECT *
FROM(SELECT *
FROM EMP
ORDER BY SAL DESC)
WHERE ROWNUM <= 5;
ORDER BY SAL DESC;
ORDER BY 컬럼 OFFSET N {ROW | ROWS} -- OFFSET : 건너뛸 행의 수
FETCH {FIRST | NEXT} N {ROW | ROWS} ONLY
ONLY - 내가 지정한 딱 row limits 갯수만 리턴
WITH TIES - 내가 지정한 row limits 에서 맨 마지막 행과 same sort key인 row들도 줄줄이 보여줌