Row Number & Sequence

유동현·2022년 11월 8일
0

오라클

목록 보기
11/18

✏️Sequence

  • Insert 문과 함께 사용하며 시퀀스명.nextval 을 쓰게되면 사용자가 지정한 start with 부터 increment by로 지정한 값만큼 차례차례 증가하면서 테이블에 값을 입력하게된다. 단 insert 문을 잘못작성하거나 후에나올 insert를 사용하는 pl/sql에서 오류가 발생했을시 시퀀스문은 실행되어있을 수도있으니 조심할것
  • 시퀀스는 ROLLBACK이 적용되지 않는다.
    삭제했을시 DBA에게 다시 생성해달라고 요청해야
-- CREATE SEQUENCE 시퀀스명 → 여기까지만 쓰더라도 기본 시퀀스 생성됨
--                          (1부터 시작해서 1씩 증가해서 무한대까지가는 거 생성됨)

CREATE SEQUENCE SEQ_BOARD   -- 기본적인 시퀀스 생성 구문
START WITH 1                -- 시작값
INCREMENT BY 1                 -- 증가값
NOMAXVALUE                  -- 최댓값
NOCACHE;                    -- 캐시사용여부  
--==>> Sequence SEQ_BOARD이(가) 생성되었습니다.
-- 그냥 CREATE SEQUENCE SEQ_BOARD 까지만하면
-- 위에 쿼리문에서 NOCACHE 만 제외한 거랑 똑같은 결과로 생성됨

-- NOCACHE : 미리 사용될거 뽑아두는 개념!
--           처리해야되는거 10개 있어서 10개 미리 뽑아두면,
--           다른 사람 와서 이용할 때는 아직 앞에 10개 다 쓴 것도 아닌데 11번 해야됨,,,
-- NOCACHE
-- 장점 : 번호표 발급 받는 사람이 대기열에서 오래 안기다려도 된다.
-- 단점 : 미리 뽑아두고, 다른 업무 수행하고 있으면, 
--        다음 사람은 일련번호로 다음 번호를 뽑게 되는 게 아니라 
--        그만큼 뛰어넘고 난 번호를 쓰게 됨,,
  • Insert에서 사용법
--○ 데이터 입력 -> 게시판에 게시물을 작성한 액션
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '아~자고
싶다', '10분만 자고 올께요', '장현성', 'java002$', DEFAULT);

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '아~웃겨', 'ㅋㅋㅋㅋㅋㅋㅋㅋ', '엄소연', 'java002$', DEFAULT);

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '보고싶다', '원석이가 보고 싶어요', '조영관', 'java002$', DEFAULT);

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '배고파요', '아침인데 배고파요', '유동현', 'java002$', DEFAULT);



- 현재 시퀀스명 확인

SELECT 
        LAST_NUMBER 
FROM 
        USER_SEQUENCES 
WHERE 
        SEQUENCE_NAME = '시퀀스네임';

✏️Row Number

나오는 데이터의 행의갯수를 sql developer에서 세주는것으로
Order by 를 씀으로써 정렬기준을 부여할수 있다.

SELECT ENAME "사원명", SAL "급여", HIREDATE "입사일"
FROM EMP;

--나오는 데이터의 행갯수 = sql developer 에서 세주는것뿐

SELECT ROW_NUMBER() OVER(ORDER BY SAL DESC) "테스트"
        ,ENAME "사원명", SAL "급여", HIREDATE "입사일"
FROM EMP;
/*
1	KING	5000	1981-11-17
2	FORD	3000	1981-12-03
3	SCOTT	3000	1987-07-13
4	JONES	2975	1981-04-02
5	BLAKE	2850	1981-05-01
6	CLARK	2450	1981-06-09
7	ALLEN	1600	1981-02-20
8	TURNER	1500	1981-09-08
9	MILLER	1300	1982-01-23
10	WARD	1250	1981-02-22
11	MARTIN	1250	1981-09-28
12	ADAMS	1100	1987-07-13
13	JAMES	950	1981-12-03
14	SMITH	800	1980-12-17
  • 단, 정렬기준에 따라 결과는 달라진다.
SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
       ,TITLE, NAME, CREATED
FROM TBL_BOARD
ORDER BY 4 DESC;
/*
5	집중합시다	유동현	2022-08-22 10:39:50
2	보고싶다	조영관	2022-08-22 10:39:41
4	너무멀어요	김태민	2022-08-22 10:39:41
1	아~웃겨	엄소연	2022-08-22 10:39:41
3	배고파요	유동현	2022-08-22 10:39:41
*/


SELECT ROW_NUMBER() OVER(ORDER BY ENAME) "테스트"
        ,ENAME "사원명", SAL "급여", HIREDATE "입사일"
FROM EMP
WHERE DEPTNO = 20
ORDER BY ENAME;
/*
1	ADAMS	1100	1987-07-13
2	FORD	3000	1981-12-03
3	JONES	2975	1981-04-02
4	SCOTT	3000	1987-07-13
5	SMITH	800	1980-12-17
*/ --인터넷 게시판에서 주로 쓰이는 기능

--※ 게시판의 게시물 번호를 SEQUENCE 나 IDENTITY 를 사용하게 되면
--  게시물을 삭제했을 경우.. 삭제한 게시물의 자리에 다음 번호를 가진
-- 게시물이 등록되는 상황이 발생하게 된다.
-- 이는... 보안성 측면이나... 미관상.. 바람직하지 않은 상태일 수 있기 때문에
-- ROW_NUMBER() 의 사용을 고려해 볼 수 있다.
-- 관리의 목적으로 사용할 때에는 SEQUENCE 나 IDENTITY를 사용하지만
-- 단순히 게시물을 목록화 하여 사용자에게 리스트 형식으로 보여줄 때에는
-- 사용하지 않는 것이 바람직할 수 있다.

0개의 댓글