1. VIEW
- 가상의 테이블
- 쿼리가 내보내는 결과가 VIEW 임. 다음거 보려면 사라짐
- 필요한 정보가 여러 테이블에 분산되어 있고 JOIN이 자주 발생되는 경우 매번 JOIN연산 수행대신 뷰를 생성하여 처리
- 특정 자료에 대한 접근을 제한하고자 하는 경우
왜 날라갔을까? 이름이 없어서.. 이름이 없으면 저장이 안됨
자바의 익명클래스 (GUI쓸때 많이씀. 클릭했을때 실행되는것들을 클래스로...왜? 누를때마다만 실행되믄되니까.함수의 매개변수자리에 이름없는 클래스를ㄹ 집어넣는다. )
오라클에서, 셀렉트에 의해서 영향받은 행들의 집합 >커서 >뷰랑비슷
뷰는 실시간으로 변형되어지는.. 홈피의 접속자 통계같은거
정규화를 시킬수록 분할이 됨.. 특정 컬럼을 조회하려는데 조회하는 컬럼들잉 고정이 되어잇는데 매번 조인하기 번거로우니까 조인한번 한거를 보관해서 필요할때 따로쓰려고
*사용형식
CREATE [OR REPLACE] VIEW 뷰이름[(컬럼명),...)]
AS
SELECT문
[WITH CHECK OPTION]
[WITH READ ONLY];
-OR REPLACE' : 동일이름의 뷰가 존재하면 OVER WRITE
- '(컬럼명,...)': 생성되는 뷰에 부여될 컬럼명, 생략하면 원본 테이블의 컬럼명이 사용됨
- 'WITH CHECK OPTION' : SELECT문의 조건에 위배되는 값으로 변경, 삽입될 경우 실행이 거절됨(오류)
- 'WITH READ ONLY' : 읽기 전용 뷰 (INSERT, UPDATE, DELETE)문의 실행 거절) 생략하면 수정가능한 뷰 생성- 원본테이블도 변경
-'WITH CHECK OPTION'과 'WITH READ ONLY'는 같이 사용할 수 없음
EX
회원테이블에서 마일리지가 3000이상인 회원의 회원벌호, 회원명, 마일리지를 조회하는 뷰를 생성하시오
CREATE OR REPLACE VIEW V_MEMBER01
AS
SELECT MEM_ID 회원번호,
MEM_NAME 회원명,
MEM_MILEAGE
FROM MEMBER
WHERE MEM_MILEAGE>=3000;
SELECT * FROM V_MEMBER01;
CREATE OR REPLACE VIEW V_MEMBER01(MID,MNAME,MILE)
AS
SELECT MEM_ID 회원번호,
MEM_NAME 회원명,
MEM_MILEAGE
FROM MEMBER
WHERE MEM_MILEAGE>=3000;
이렇게 컬럼명만 더 정해서 덮어쓰면
진현경의 마일리지 변경할거임
UPDATE V_MEMBER01
SET 마일리지=500
WHERE 회원번호='x001';
컬럼명을 한글로해놔서 이렇게쓴다.
SELECT MEM_NAME,MEM_MILEAGE
FROM MEMBER
WHERE MEM_ID='x001';
그럼 원본데이터를 바꾸면 뷰도 바뀔까?
UPDATE MEMBER
SET MEM_MILEAGE=9500
WHERE MEM_ID='e001';
SELECT * FROM V_MEMBER01;
WITH CHECK OPTION을 써보자
CREATE OR REPLACE VIEW V_MEMBER01
AS
SELECT MEM_ID 회원번호,
MEM_NAME 회원명,
MEM_MILEAGE 마일리지
FROM MEMBER
WHERE MEM_MILEAGE>=3000
WITH CHECK OPTION;
UPDATE V_MEMBER01
SET 마일리지=2700
WHERE 회원번호='x001';
INSERT INTO V_MEMBER01
VALUES('a002','김소연',1000);
CREATE OR REPLACE VIEW V_LPROD01
AS
SELECT * FROM LPROD;
INSERT INTO V_LPROD01
VALUES (10,'P501','농산물')
이게 되게 위험한거임 그램서 WITH READ ONLY를 만든것
CREATE OR REPLACE VIEW V_LPROD01
AS
SELECT * FROM LPROD
WITH READ ONLY;
이렇게 리드온리 넣어서 다시 만들고
UPDATE V_LPROD01
SET LPROD_NM = '수산물'
WHERE LPROD_ID=10;
*테이블과 테이블 사이에 키가 겹치는게없어서 중간테이블이 필요하다? 이때 뷰를 활용한다.
**뷰 사용시 주의사항
뷰생성시 제약조건이 존재하는 경우 ORDER BY절 사용금지
뷰 생성시 집계함수(GROUP BY), DISTINCT 사용시 DML 명령사용 불가
SELECT 문에 표현식이 사용된 경우 해당 컬럼의 수정 추가 불가
CURRVAL, NEXTVAL 등 의사컬럼(Pseudo column) 사용 불가
ROWID,ROWNUM, LEVEL등 의사컬럼 사용시 별칭 불가
2. SEQUENCE
- 일련된 값 (자동증가, 감소)
- 모든 객체에 독립적
-테이블 생성시 PK 설정에 사용
*사용형식
CREATE SEQUENCE 시퀀스명
[START WITH n] -- 시작값 default는 1
[INCREMENT BY n] -- 증가[감소] 값, default는 1
[MAXVALUE n | NOMAXVALUE] -- 최대값 default는 NOMAXVALUE: 10^27
[MINVALUE n | NOMINVALUE] -- 최소값 default는 NOMAXVALUE: 1
[CYCLE | NOCYCLE]--증가는 최대값까지 도달 후 최소값부터 다시 시작여부,
--default는 NOCYCLE
[CACHE | NOCACHE]--메모리에 시퀀스 값을 생성하는 지 여부,default는 NOCACHE 20
[ORDER | NOORDER];--요청 순서대로 시퀀스 생성 보장여부, default는 NOORDER
시퀀스의 의사컬럼
- CURRVAL : 시퀀스 객체가 가지고 잇는 현재값, 시퀀스명.CURRVAL
- NEXTVAL : 시퀀스 객체의 다음값, 시퀀스명.NEXTVAL
**시퀀드 객체 생성 후 첫번째 명령은 반드시 시퀀스명.NEXTVAL이어야 함
EX
CREATE SEQUENCE seq_lprod
START WITH 11;
SELECT seq_lprod.CURRVAL FROM DUAL;
오류 sequence SEQ_LPROD.CURRVAL is not yet defined in this session
SELECT seq_lprod.NEXTVAL FROM DUAL;
숙제!
LPROD_ID는 키값이 아니다. 시퀀스값임
11번에 농OR수산물을 p502을 추가해라 (seq_lprod)를 써서