가상의 테이블
사용자 입장에서는 일반 테이블이랑 다를게 없어보인다.
개발자가 원본 테이블에서 보여주고 싶은 내용만 뷰에 허용을 해서 보여주기 때문에
보안성이 있다고 한다.
문법
USE tabledb;
CREATE VIEW v_usertbl
AS
select userid, name, addr from usertbl;
실습
usertbl
use sqldb;
CREATE OR REPLACE VIEW v_usertbl -- 뷰가 이미 있으면 덮어쓰고 없으면 만든다.
AS
SELECT U.userid AS 'USER ID',U.name AS 'USER NAME',
B.prodName AS 'PRODUCT NAME',U.addr
FROM usertbl U
INNER JOIN buytbl B
ON U.userid=B.userid;
SELECT `USER ID`,`USER NAME` FROM v_usertbl; -- 열 이름에 띄어쓰기가 있으면 벡틱을 사용
SELECT * FROM usertbl;
v_usertbl
뷰에서 작업한 내용은 원본 테이블에도 적용이 되는지 직접 확인해 봤다.
UPDATE v_usertbl
SET addr = '서울' WHERE addr = '익산';
SELECT * FROM usertbl;
원래 서울이었던 정보가 익산으로 바뀌었다.
뷰를 생성할 때 집계 함수를 사용해도 만들 수 있다.
이런 경우는 UPDATE 불가능이다.
INFORMATION_SCHEMA.VIEWS
을 통해 업데이트 가능 여부를 확인할 수 있다.
CREATE VIEW v_sum
AS
SELECT userid AS 'userid', SUM(price*amount) AS 'total'
FROM buytbl GROUP BY userid;
SELECT * from v_sum;
SELECT * FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA = 'sqldb' AND TABLE_NAME = 'v_sum';
IS_UPDATABLE : NO
DESCRIBE v_usertbl; -- 테이블의 구조를 검색한다. 기본키는 확인 안된다.
SHOW CREATE VIEW v_usertbl; -- 뷰를 만드는 데 사용된 원본 쿼리를 보여주어 구성을 알 수 있다.
WITH CHECK OPTION
-- 사용 예시
-- employees 테이블에서 salary 필드가 5000 이상인 레코드만을 가져오는 뷰 high_salary_employees를 만들었다면, 다음과 같이 WITH CHECK OPTION을 추가하여 해당 뷰에서 salary 필드를 업데이트할 때 조건을 만족해야만 허용하도록 할 수 있습니다.
CREATE VIEW high_salary_employees AS
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary >= 5000
WITH CHECK OPTION;
-- 위의 뷰에서 salary 필드가 5000 미만인 레코드를 업데이트하려고 하면, 해당 레코드는 뷰에서 필터링되므로 업데이트가 허용되지 않습니다. 따라서 WITH CHECK OPTION을 사용하여 데이터의 무결성을 유지할 수 있습니다.
WITH CHECK OPTION
데이터를 업데이트하는 뷰(view)에서 사용할 수 있는 옵션입니다. 이 옵션은 뷰를 통해 업데이트된 데이터가 해당 뷰에서 정의한 조건을 충족하는지 확인하여 무결성 제약 조건(integrity constraint)을 유지하도록 합니다.
DROP VIEW 뷰_이름;