VIEW( 뷰 )
Sequence( 시퀀스 )
- 하나의 가상 테이블이라고 생각
- 작업을 하다 보면 자주 조회하는 데이터들이 존재한다. 한 테이블에 데이터가
있으면 조회하기 편하겠지만, 그렇지 않은 경우가 있다. 여러 테이블을 join 하여
가져오면 쿼리가 복잡한 경우도 있다. 이런 경우 쿼리로 뷰를 만들어 놓고
사용하면 편리하다.
- 뷰는 보안에도 유리하다. 테이블에 데이터를 노출시키고 싶지 않을 때,
뷰를 사용하여 보여줄 데이터만 뷰로 제공할 수 있다.
- view는 table과 유사하며, 테이블처럼 사용한다.
- 테이블과는 달리 데이터를 저장하기 위한 물리적인 공간이
필요하지 않은 가상 테이블이다.
- 데이터를 물리적으로 갖지 않지만, 논리적인 집합을 갖는다.
- 테이블과 마찬가지로 select , insert , update , delete 명령이 가능하다.
-- 1. 50번 부서, job_id가 ST_CLERK, 연봉이 40000 이상인 사람들의
-- 사번, last_name, department_id, hire_date
CREATE VIEW s_man( emp_id, last_name, dept_id, hire_date )
AS SELECT EMPLOYEE_ID , LAST_NAME , DEPARTMENT_ID , HIRE_DATE
FROM EMPLOYEES e
WHERE DEPARTMENT_ID = 50
AND JOB_ID = 'ST_CLERK'
AND SALARY * 12 >= 40000
;
SELECT * FROM S_MAN sm ;
-- 2. 50번 부서 사원들의 사번, 'first_name last_name'(이어서 출력), department_id, hire_date
CREATE VIEW full_name( emp_id, name, dept_id, hire_date )
AS SELECT EMPLOYEE_ID , FIRST_NAME || ' ' || LAST_NAME , DEPARTMENT_ID , HIRE_DATE
FROM EMPLOYEES e
WHERE DEPARTMENT_ID = 50
;
SELECT * FROM FULL_NAME fn ;
-- 3. 사번, 이름, 부서번호, 부서명, 입사일 출력 view 생성
CREATE VIEW all_data( emp_id, name, dept_id, dept_name, hire_date )
AS SELECT e.EMPLOYEE_ID , FIRST_NAME || ' ' || LAST_NAME ,
e.DEPARTMENT_ID , d.DEPARTMENT_NAME , e.HIRE_DATE
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY e.EMPLOYEE_ID
;
-- DROP VIEW all_data ;
SELECT * FROM ALL_DATA ad ;
- 연속적인 번호를 만들어주는 기능
- 시퀀스란 자동 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체이다.
- 보통 PK값의 중복을 방지하기 위해 사용한다.
- 예를 들어, 게시판의 글이 하나 추가될 때마다 글번호(PK)가 생겨야 한다고 할 때,
만약 100번까지 글 번호가 생성되었다면, 그 다음 글이 추가가 되었을 경우
글 번호가 101인 하나의 row를 생성해 주어야 한다. 이 때, 101이라는 숫자를
얻으려면 기존 글 번호 중 가장 큰 값에 +1을 하는 로직을 어딘가에는 넣어야 한다.
이 때, 시퀀스를 사용하면 이러한 로직이 필요 없이 데이터베이스에 row가 추가될 때마다
자동으로 +1을 시켜주어 매우 편리하다.
create sequence 시퀀스이름
increment by n : 증가값을 설정, ex) 2 : 2씩 증가, 기본값 : 1
start with n : 시작값 설정, 기본값 : 1
maxvalue n | nomaxvalue : 시퀀스 최대값 설정 | 무한대
minvalue n | nominvalue : 시퀀스 최소값 설정 | 무한대
cycle | no cycle : cycle로 지정하면, maxvalue에 도달했을 때
다시 minvalue부터 시작하게 된다.
기본값은 nocycle
cache n | nocache : 시퀀스의 속도를 개선하기 위하여 캐싱여부 지정
** cache : 속도를 증가시키기 위해서 sequence 번호를 한 번에 여러 개씩 메모리에 올려놓고
작업을 한다. 이것을 사용하면 매번 sequence 번호를 생성하는 것보다 빠르기 때문에
사용한다. cache 20 -> 1~20번 까지의 시퀀스 번호를 생성
-- sequence
-- 제품번호 생성하는 시퀀스 만들기
CREATE SEQUENCE seq_serial_no
INCREMENT BY 1
START WITH 100
MAXVALUE 110
MINVALUE 99
CYCLE
cache 3
;
CREATE TABLE good(
good_no number(3),
good_name varchar2(10)
) ;
SELECT * FROM GOOD ;
-- nextval : 다음 값
INSERT INTO GOOD VALUES ( seq_serial_no.nextval, '제품1' );
-- 시퀀스 삭제
DROP SEQUENCE seq_serial_no ;
-- currval : 시퀀스 현재값
SELECT seq_serial_no.currval
FROM dual
;