📚 Study/Oracle

Oracle :: ROW_NUMBER(), SEQUENCE

bono-hye 2023. 10. 29. 23:07

(파일명 20231025_01_scott)

■ ROW_NUMBER()

- 단순히 게시물을 목록화하여 사용자에게 리스트 형식으로 보여줄 때 적합한 함수.

--■■■ ROW_NUMBER() ■■■--

SELECT ENAME"사원명", SAL"급여", HIREDATE"입사일"
FROM EMP;
--==>>
/*
SMITH	 800	1980-12-17
ALLEN	1600	1981-02-20
WARD	1250	1981-02-22
JONES	2975	1981-04-02
MARTIN	1250	1981-09-28
BLAKE	2850	1981-05-01
CLARK	2450	1981-06-09
SCOTT	3000	1987-07-13
KING	5000	1981-11-17
TURNER	1500	1981-09-08
ADAMS	1100	1987-07-13
JAMES	 950	1981-12-03
FORD	3000	1981-12-03
MILLER	1300	1982-01-23
*/

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 SAL DESC)"관찰"
     , ENAME"사원명", SAL"급여", HIREDATE"입사일"
FROM EMP
ORDER BY ENAME;
--==>>
/*
12	ADAMS	1100	1987-07-13
7	ALLEN	1600	1981-02-20
5	BLAKE	2850	1981-05-01
6	CLARK	2450	1981-06-09
2	FORD	3000	1981-12-03
13	JAMES	 950	1981-12-03
4	JONES	2975	1981-04-02
1	KING	5000	1981-11-17
11	MARTIN	1250	1981-09-28
9	MILLER	1300	1982-01-23
3	SCOTT	3000	1987-07-13
14	SMITH	 800	1980-12-17
8	TURNER	1500	1981-09-08
10	WARD	1250	1981-02-22
*/


SELECT ROW_NUMBER() OVER(ORDER BY ENAME)"관찰"
     , ENAME"사원명", SAL"급여", HIREDATE"입사일"
FROM EMP
ORDER BY ENAME;
--==>>
/*
1	ADAMS	1100	1987-07-13
2	ALLEN	1600	1981-02-20
3	BLAKE	2850	1981-05-01
4	CLARK	2450	1981-06-09
5	FORD	3000	1981-12-03
6	JAMES	 950	1981-12-03
7	JONES	2975	1981-04-02
8	KING	5000	1981-11-17
9	MARTIN	1250	1981-09-28
10	MILLER	1300	1982-01-23
11	SCOTT	3000	1987-07-13
12	SMITH	 800	1980-12-17
13	TURNER	1500	1981-09-08
14	WARD	1250	1981-02-22
*/


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

 

■ SEQUENCE

--○ SEQUENCE(시퀀스 : 주문번호)
--   → 사전적인 의미 : 1. (일련의) 연속적인 사건들 2. (사건, 행동 등의) 순서

--○ 시퀀스 생성
CREATE SEQUENCE SEQ_BOARD   -- 기본적인 시퀀스 생성 구문
START WITH 1                -- 시작값 설정 옵션
INCREMENT BY 1              -- 증가값 설정 옵션
NOMAXVALUE                  -- 최대값 설정 옵션    
NOCACHE;                    -- 캐시 사용 안함 설정 옵션           (캐시란 겁나 맛집인 곳에서 번호표 한방에 미리 다 뽑고 사람들 나눠줌 사람들이 뽑은 것 만큼 없으면 번호표 버리게 됨)
--==>> Sequence SEQ_BOARD이(가) 생성되었습니다.

--○ 실습 테이블 생성(테이블명 : TBL_BOARD)
CREATE TABLE TBL_BOARD                  -- TBL_BOARD 테이블 생성 구문 → 게시판 테이블
( NO        NUMBER                      -- 게시물 번호       → 사용자가 직접 작성 Ⅹ
, TITLE     VARCHAR2(50)                -- 게시물 제목       → 사용자가 직접 작성 ○  
, CONTENTS  VARCHAR2(1000)              -- 게시물 내용       → 사용자가 직접 작성 ○ 
, NAME      VARCHAR2(20)                -- 게시물 작성자     → 사용자가 직접 작성 △
, PW        VARCHAR2(20)                -- 게시물 패스워드   → 사용자가 직접 작성 △
, CREATED   DATE DEFAULT SYSDATE        -- 게시물 작성일     → 사용자가 직접 작성 Ⅹ
);
--==>> Table TBL_BOARD이(가) 생성되었습니다.


--○ 데이터 입력 → 게시판에 게시물 작성
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '아~~~ 힘들다', '10분만 쉬었다 올께요', '문정환', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '아~ 졸리다', '10분만 자고 올께요', '정한울', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '아~ 웃겨', '하루하루가 재미있어요', '노은하', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '보고싶다', '범구가 너무너무 보고싶어요', '김수환', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '배고파요', '점심을 먹었는데 배고파요', '김민지', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '아직 남아있네요', '두 시간 반이나 남아있네요', '이윤수', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '그만하고싶다', '그냥 넘어갈까....', '김호진', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '아~ 배아파', 'ㅋㅋㅋㅋㅋ', '노은하', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '소근소근', '궁시렁궁시렁', '이윤수', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '모자라요', '아직 잠이 모자라요', '김동민', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

--○ 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==>> Session이(가) 변경되었습니다.


--○ 확인
SELECT *
FROM TBL_BOARD;
--==>>
/*
1	아~~~ 힘들다	    10분만 쉬었다 올께요        	문정환	java006$	2023-10-29 23:01:27
2	아~ 졸리다      	10분만 자고 올께요	        정한울	java006$	2023-10-29 23:01:29
3	아~ 웃겨	        하루하루가 재미있어요	        노은하	java006$	2023-10-29 23:01:31
4	보고싶다	        범구가 너무너무 보고싶어요	김수환	java006$	2023-10-29 23:01:33
5	배고파요	        점심을 먹었는데 배고파요	    김민지	java006$	2023-10-29 23:01:36
6	아직 남아있네요	두 시간 반이나 남아있네요  	이윤수	java006$	2023-10-29 23:01:39
7	그만하고싶다	    그냥 넘어갈까....	        김호진	java006$	2023-10-29 23:01:43
8	아~ 배아파	    ㅋㅋㅋㅋㅋ	                노은하	java006$	2023-10-29 23:01:46
9	소근소근        	궁시렁궁시렁	                이윤수	java006$	2023-10-29 23:01:49
10	모자라요	        아직 잠이 모자라요	        김동민	java006$	2023-10-29 23:01:53
*/

--○ 커밋
COMMIT;
--==>> 커밋 완료.

--○ 게시물 삭제
DELETE
FROM TBL_BOARD
WHERE NO = 1;
--==>> 1 행 이(가) 삭제되었습니다.

DELETE
FROM TBL_BOARD
WHERE NO = 6;
--==>> 1 행 이(가) 삭제되었습니다.

DELETE
FROM TBL_BOARD
WHERE NO = 8;
--==>> 1 행 이(가) 삭제되었습니다.

DELETE
FROM TBL_BOARD
WHERE NO = 10;
--==>> 1 행 이(가) 삭제되었습니다.


--○ 확인
SELECT *
FROM TBL_BOARD;
--==>>
/*
2	아~ 졸리다	10분만 자고 올께요	        정한울	java006$	2023-10-25 15:28:18
3	아~ 웃겨	    하루하루가 재미있어요	        노은하	java006$	2023-10-25 15:31:05
4	보고싶다	    범구가 너무너무 보고싶어요	김수환	java006$	2023-10-25 15:31:44
5	배고파요    	점심을 먹었는데 배고파요	    김민지	java006$	2023-10-25 15:32:34
7	그만하고싶다	그냥 넘어갈까....	        김호진	java006$	2023-10-25 15:37:46
9	소근소근	    궁시렁궁시렁	                이윤수	java006$	2023-10-25 15:38:50
*/

--○ 게시물 작성
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '집중합시다', '저는 전혀 졸리지 않아요', '임하성', 'java006$', DEFAULT);
--==>> 1 행 이(가) 삽입되었습니다.

--○ 게시물 삭제
DELETE
FROM TBL_BOARD
WHERE NO = 7;
--==>> 1 행 이(가) 삭제되었습니다.

--○ 확인
SELECT *
FROM TBL_BOARD;
--==>>
/*
2	아~ 졸리다	10분만 자고 올께요	        정한울	java006$	2023-10-29 23:01:29
3	아~ 웃겨   	하루하루가 재미있어요     	노은하	java006$	2023-10-29 23:01:31
4	보고싶다	    범구가 너무너무 보고싶어요	김수환	java006$	2023-10-29 23:01:33
5	배고파요	    점심을 먹었는데 배고파요	    김민지	java006$	2023-10-29 23:01:36
9	소근소근	    궁시렁궁시렁	                이윤수	java006$	2023-10-29 23:01:49
11	집중합시다	저는 전혀 졸리지 않아요	    임하성	java006$	2023-10-29 23:03:46
*/


--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ 게시판의 게시물 리스트 조회
SELECT NO "글번호", TITLE "제목", NAME "작성자", CREATED "작성일"
FROM TBL_BOARD;
--==>>
/*
2	아~ 졸리다	정한울	2023-10-25 15:28:18
3	아~ 웃겨	    노은하	2023-10-25 15:31:05
4	보고싶다	    김수환	2023-10-25 15:31:44
5	배고파요	    김민지	2023-10-25 15:32:34
9	소근소근	    이윤수	2023-10-25 15:38:50
11	집중합시다	임하성	2023-10-25 16:06:23
*/

SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
     , TITLE "제목", NAME "작성자", CREATED "작성일"
FROM TBL_BOARD;
--==>>
/*
1	아~ 졸리다	정한울	2023-10-25 15:28:18
2	아~ 웃겨   	노은하	2023-10-25 15:31:05
3	보고싶다	    김수환	2023-10-25 15:31:44
4	배고파요	    김민지	2023-10-25 15:32:34
5	소근소근	    이윤수	2023-10-25 15:38:50
6	집중합시다	임하성	2023-10-25 16:06:23
*/

SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
     , TITLE "제목", NAME "작성자", CREATED "작성일"
FROM TBL_BOARD
ORDER BY 4 DESC;
--==>>
/*
6	집중합시다	임하성	2023-10-25 16:06:23
5	소근소근	    이윤수	2023-10-25 15:38:50
4	배고파요	    김민지	2023-10-25 15:32:34
3	보고싶다    	김수환	2023-10-25 15:31:44
2	아~ 웃겨	    노은하	2023-10-25 15:31:05
1	아~ 졸리다	정한울	2023-10-25 15:28:18
*/