본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] ROW_NUMBER() SEQUENCE

-----■■■ 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;

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


--※ 관찰
CREATE TABLE TBL_AAA
(NO      NUMBER
,NAME   VARCHAR2(40)
,GRADE  CHAR
);
--==>>Table TBL_AAA이(가) 생성되었습니다.
INSERT INTO TBL_AAA(NO,NAME,GRADE) VALUES(1, '선혜연', 'A');

INSERT INTO TBL_AAA(NO,NAME,GRADE) VALUES(2, '이상화', 'B');

INSERT INTO TBL_AAA(NO,NAME,GRADE) VALUES(3, '선혜연', 'A');

INSERT INTO TBL_AAA(NO,NAME,GRADE) VALUES(4, '박민지', 'C'); --이상화A 한혜림 B 한혜림 B


INSERT INTO TBL_AAA(NO,NAME,GRADE) VALUES(5, '이상화', 'A');

INSERT INTO TBL_AAA(NO,NAME,GRADE) VALUES(6, '한혜림', 'B');

INSERT INTO TBL_AAA(NO,NAME,GRADE) VALUES(7, '한혜림', 'B');

--==>>1 행 이(가) 삽입되었습니다. *7
COMMIT;


SELECT *
FROM TBL_AAA;


UPDATE TBL_AAA
SET GRADE = 'A'
WHERE NAME = '이상화' AND GRADE = 'B';
--==>> 1 행 이(가) 업데이트되었습니다.


COMMIT;


SELECT *
FROM TBL_AAA;

/*
1	선혜연	A
2	이상화	A  ☆
3	선혜연	A
4	박민지	C
5	이상화	A  ☆ 더 이상 둘을 구분할 수 없게 된다.
6	한혜림	B
7	한혜림	B
*/
-- ● SEQUENCE 생성 (시퀀스, 주문번호)

-- → 사전적인 의미 : 1. (일련의) 연속적인 사건들
--                    2. (사건, 행동 등의) 순서 ------------------마지은행의번호표처럼....
                    
                    
CREATE SEQUENCE SEQ_BOARD -- 시퀀스 기본 생성 구문(MS-SQL 의 IDENTITY 와 동일한 개념)
START WITH 1              -- 시작값을 1번부터 발행
INCREMENT BY 1            -- 1 씩 증가하게끔
NOMAXVALUE                -- 최대값의 제한을 두지 않음
NOCACHE;                  -- 캐시(임시저장메모리) 사용하지 않겠다   -??
                                                                    

--==>>Sequence SEQ_BOARD이(가) 생성되었습니다.
--DROP SEQUENCE SEQ_BOARD;

-- ● 테이블 생성(TBL_BOARD)

CREATE TABLE TBL_BOARD              -- TBL_BOARD이름의 테이블 생성 → 게시판
(NO         NUMBER                  -- 게시물 번호          X
,TITLE      VARCHAR2(50)            -- 게시물 제목          O
,CONTENTS   VARCHAR2(2000)          -- 게시물 내용          O 
,NAME       VARCHAR2(20)            -- 게시물 작성자       △
,PW         VARCHAR2(20)            -- 게시물 패스워드     △
,CREATED    DATE DEFAULT SYSDATE    -- 게시물 작성일        X
);

--==>>Table TBL_BOARD이(가) 생성되었습니다.
-- ○ 데이터 입력 → 게시판에 게시물 작성
--DROP TABLE TBL_BOARD;




INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '앗싸~1등', '내가 1등이지롱!', '선혜연','JAVA006$',DEFAULT);


INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '건강관리', '다들 건강 챙깁시다', '이상화','JAVA006$',DEFAULT);

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '오늘은', '저녁 뭐 먹지....', '박민지','JAVA006$',DEFAULT);

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '오늘은', '미세먼지 없나?', '한혜림','JAVA006$',DEFAULT);


INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '공부하고 싶은데', '집이 너무 멀어요', '김아별','JAVA006$',DEFAULT);

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '질문있습니다', '쉬었다 하면 안되나요', '이유림','JAVA006$',DEFAULT);

INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '질문있습니다', '생각나면 다시 질문할께요', '이희주','JAVA006$',DEFAULT);


SELECT *
FROM TBL_BOARD;

COMMIT;

-- ● 게시물 삭제
DELETE
FROM  TBL_BOARD
WHERE NO=4;
--==>>1 행 이(가) 삭제되었습니다.
/*
1	앗싸~1등		내가 1등이지롱!			선혜연	JAVA006$	2021-03-31
2	건강관리		다들 건강 챙깁시다			이상화	JAVA006$	2021-03-31
3	오늘은				저녁 뭐 먹지....			박민지	JAVA006$	2021-03-31
5	공부하고 싶은데	집이 너무 멀어요			김아별	JAVA006$	2021-03-31
6	질문있습니다		쉬었다 하면 안되나요			이유림	JAVA006$	2021-03-31
7	질문있습니다		생각나면 다시 질문할께요	이희주	JAVA006$	2021-03-31*/


-- ● 게시물 작성
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '졸려요', '전 그냥 잘래요', '이새롬', 'JAVA006$',DEFAULT);


-- ● 게시물 삭제
DELETE
FROM  TBL_BOARD
WHERE NO=2;


-- ● 게시물 삭제
DELETE
FROM  TBL_BOARD
WHERE NO=8;


INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '저는요', '잘 지내고 있습니다', '장서현', 'JAVA006$',DEFAULT);

COMMIT;

-- ● 확인
SELECT *
FROM TBL_BOARD;
/*
1	앗싸~1등	        내가 1등이지롱!		선혜연	JAVA006$	2021-03-31
3	오늘은	        	저녁 뭐 먹지....		박민지	JAVA006$	2021-03-31
5	공부하고 싶은데	집이 너무 멀어요		김아별	JAVA006$	2021-03-31
6	질문있습니다		쉬었다 하면 안되나요		이유림	JAVA006$	2021-03-31
7	질문있습니다		생각나면 다시 질문할께요	이희주	JAVA006$	2021-03-31
9	저는요	       	 잘 지내고 있습니다			장서현	JAVA006$	2021-03-31*/

SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
    ,  TITLE "제목", NAME "작성자" , CREATED "작성일"    
FROM TBL_BOARD
ORDER BY 4 DESC;
/*
6	저는요	        장서현	21/03/31
5	질문있습니다	이희주	21/03/31
4	질문있습니다	이유림	21/03/31
3	공부하고 싶은데	김아별	21/03/31
2	오늘은	        박민지	21/03/31
1	앗싸~1등	        선혜연	21/03/31*/

--● 게시물 작성
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '외로워도', '슬퍼도 나는 안울어', '박정준', 'JAVA006$', DEFAULT);
--==> 1 행 이(가) 삽입되었습니다.

SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
     , TITLE "제목", NAME "작성자", CREATED "작성일"
FROM TBL_BOARD
ORDER BY 4 DESC;


-- ● 게시물 삭제
DELETE
FROM TBL_BOARD
WHERE NO=7;

COMMIT;

SELECT ROW_NUMBER() OVER(ORDER BY CREATED) "글번호"
    ,  TITLE "제목", NAME "작성자" , CREATED "작성일"    
FROM TBL_BOARD
ORDER BY 1 DESC;


/*
6	외로워도	        박정준	21/03/31
5	저는요	        	장서현	21/03/31
4	질문있습니다		이유림	21/03/31
3	공부하고 싶은데	김아별	21/03/31
2	오늘은	        	박민지	21/03/31
1	앗싸~1등	        선혜연	21/03/31*/