Database-sequence

 

Sequence

/*
create table board(
    boardid number primary key,
    title varchar2(50)
);
boardid >> 중복값 , null값이 없어야한다. 

게시판 글쓰기
insert into board( ) values ( )
*/
create table kboard(
num number constraint pk_kboard_num primary key,
title varchar2(50)
);
--처음 글을 쓰면 1이라는 값이 , 그 다음 부터 글을 쓰면 num에 2번 3번 으로 순차적으로 들어가기 원한다.
--JDBC : insert into kboard(title) values(?);
-->> 처음글 >> 1
-->> 다음글 >> 2,3,4
insert into kboard(num,title) 
values((select nvl(max(num),0)+1 from kboard),'4');

--delete 하고 다시 넣으려면 error
select*from kboard;
commit;

-- sequence 객체 : rollback되는 자원이 아니다.
-- ms-sql : create table board(boardnum int identity(1,1) , title varchar(20))
-- insert into board(title) values ('제목') ; >> 숫자는 알아서
-- 2012 version부터 : 오라클 처럼 sequence만들어짐

-- my-sql : create table board(boardnum int auto_increment , title varchar(20))
-- insert into board(title) values ('제목') ; >> 숫자는 알아서

/*
1.4 SEQUENCE 사용법 
테이블에 사용할 절차적인 번호를 생성하기 위해 SEQUENCE 를 사용할 수 있다. NEXTVALUE 
와 CURRVALUE 의사열을 사용하여 SEQUENCE 값을 참조한다.  
1.4.1 NEXTVAL 과 CURRVAL 의사열 
가) 특징
1) NEXTVAL 는 다음 사용 가능한 SEQUENCE 값을 반환 한다. 
2) SEQUENCE 가 참조될 때 마다, 다른 사용자에게 조차도 유일한 값을 반환한다. 
3) CURRVAL 은 현재 SEQUENCE 값을 얻는다. 
4) CURRVAL 이 참조되기 전에 NEXTVAL 이 사용되어야 한다.   
*/
create sequence board_num;

--실채번
select board_num.nextval from dual; -- 중복값이 아니고, null값이 아니라는 것을 보장 받는다.
--현재 값(채번하지 않고 정보만)
select board_num.currval from dual;


create table tboard(
  num number constraint pk_tboard_num primary key,
  title varchar2(50)
);

create sequence tboard_num;

insert into tboard(num,title)
values (tboard_num.nextval,'글쓰기');

select*from tboard;

select tboard_num.currval from dual;

delete tboard where num=5;

--게시판 10개 만든다. ex) 상품, 관리자, 회원.......... , 테이블 10개 순번은 sequence 객체 하나로 사용해도 된다.

--10에서 시작해서 2씩 증가하게 만드는 것
create sequence seq_num
start with 10
increment by 2;

select seq_num.nextval from dual;
select * from user_sequences;

--데이터 조회(게시판)
--최신글을 먼저 >> 나중에 쓴글이 먼저 나오도록
--글 번호를 순번으로 만들었으므로 
--select * from board order by boardnum desc; >> 내림차순
--개발자(sequence , rownum)
--rownum >> 의사컬럼 : 실질적으로 존재하는 것이 아니고 논리적으로 존재한다.
--ROWNUM : 실제 테이블에 존재하지 않는 컬럼인데 (행에다 번호를 부여할 수 있다.)

select empno, ename from emp;

select rownum as 순번 , empno from emp;

--TOP-n 쿼리  >> table에서 조건에 맞는 상위(TOP) 레코드에서 n개 추출해라
--근거는 정렬

--ms-sql : select top 10; --> select top 10,* from emp order by sal desc;

--oracle 은 없다 , rownum을 가지고 순번을 붙여서 뽑아야한다. 반드시 기준이 필요하다.

--1.정렬 쿼리를 만든다.
select*
from emp order by sal desc;

select e.* 
from (
    select *
    from emp order by sal desc
    ) e;
--2.쿼리에 순번을 부여하고 조건절 제시
select rownum as "num", e.* 
from (
    select *
    from emp order by sal desc
    ) e
where rownum <= 10;

paging

--  게시판 (페이징 처리 원리)
--총 100건 pagesize =10  >> 화면 한페이지에 볼 수 있는 데이터 건수 10개
--건수 / pagesize = page갯수
--pagecount = 10개
--1~100 을 10개씩 묶는다.

select * from employees;

--5번 페이지의 값을 가져온다.
select *
from(
        select rownum num ,e.*
        from(
                select * from employees order by employee_id asc
                ) e
        where rownum <= 50        
        ) s
        where num >= 40;
-- where rownum between 10 ans 20