VIEW
- 뷰는 일반 사용자 입장에서는 테이블과 동일하게 사용하는 개체임.
1. VIEW의 생성 및 출력
-- VIEW 생성
CREATE VIEW v_userTBL
AS SELECT userID, userName, addr FROM userTBL;
-- VIEW 출력
SELECT * FROM v_userTBL; -- 뷰를 테이블이라고 생각해도 무방
-- VIEW 수정
CREATE OR REPLACE VIEW v_userTBL AS SELECT userID, userName, addr FROM userTBL WHERE addr = '서울';
2. VIEW의 장점
- 뷰를 사용해서 얻을 수 있는 장점
- 보안에 도움이 됨
- 복잡한 쿼리를 단순화 시켜줄 수 있음
-- 기본적인 뷰의 생성 시에 뷰에서 사용될 열의 이름을 변경할 수도 있다
CREATE OR REPLACE VIEW v_userbuyTBL
AS SELECT U.userID AS "USER ID", U.userName AS "USER NAME",
B.prodName AS "PRODUCT NAME", U.addr,
CONCAT(U.mobile1, U.mobile2) AS "MOBILE PHONE"
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID;
SELECT "USER ID", "USER NAME" FROM v_userbuyTBL;
3. VIEW 예제 실습
-- 뷰의 수정은 생성 시와 마찬기지로 CRATE OR REPLACE VIEW 구문을 사용하면 된다
-- 한글의 열 이름도 가능하다(호환성 문제로 별로 권장하지 않는다)
CREATE OR REPLACE VIEW v_userbuyTBL
AS SELECT U.userID AS "사용자 아이디", U.userName AS "이름", B.prodName AS "제품 이름",
U.addr, CONCAT(U.mobile1, U.mobile2) AS "전화 번호"
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID;
SELECT "이름", "전화 번호" FROM v_userbuyTBL;
-- 뷰에 대한 정보는 시스템 뷰인 USER_에, 딕셔너비 뷰인 USER_VIEWS에 들어있다
CREATE OR REPLACE VIEW v_userTBL
AS SELECT userID, userName, addr FROM userTBL;
SELECT * FROM USER_VIEWS;
-- 뷰를 통해서 데이터를 변경, 수정, 뷰가 수정되면 원본 테이블도 수정된다
UPDATE v_userTBL SET addr = '부산' WHERE userID = 'JKW';
SELECT * FROM v_userTBL;
SELECT * FROM userTBL;
-- 데이터 입력
INSERT INTO v_userTBL(userID, userName, addr) VALUES('KBM','김병만','충북');
-- WITH READ ONLY문 사용
CREATE OR REPLACE VIEW v_userTBL
AS SELECT userID, userName, addr
FROM userTBL
WITH READ ONLY;
-- 읽기 전용 뷰라는 오류 발생
UPDATE v_userTBL SET addr = '태국' WHERE userID = 'SSK';
-- 그룹함수를 포함하는 뷰를 정의 GROUP BY
CREATE OR REPLACE VIEW v_sum
AS SELECT userID, SUM(price*amount) AS "Total"
FROM buyTBL GROUP BY userID;
SELECT * FROM v_sum;
-- 지정한 범위로 뷰를 생성하고 데이터 입력
CREATE OR REPLACE VIEW v_height177
AS SELECT * FROM userTBL
WHERE height >= 177;
SELECT * FROM v_height177;
-- 데이터 삭제
DELETE FROM v_height177 WHERE height < 177;
-- 데이터 입력
INSERT INTO v_height177 VALUES('MMS', '문민승', '경기', '010', '55555555' ,158, '2019-01-01');
-- 두개 이상의 테이블이 관련되는 복합 뷰를 생성하고 데이터 입력
CREATE OR REPLACE VIEW v_userbuyTBL
AS SELECT U.userID, U.userName, B.prodName, U.mobile1 || U.mobile2 AS mobile
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID;
SELECT * FROM v_userbuyTBL;
-- 두개의 테이블을 같이 사용하면 둘다 같이 입력해줘야 한다
INSERT INTO v_userbuyTBL VALUES('PKL', '박경리', '운동화', '경기', '00000000000');
DROP TABLE userTBL CASCADE CONSTRAINTS;
SELECT * FROM v_userbuyTBL;