view 란? 가상테이블. 실체는 없으며, 진짜 테이블에 링크된 개념이다.
물리적인 테이블을 근거로 select문의 조건을 파일로 작성하여 가상의 테이블로 사용한다. 메모리 절약, 복잡하고 긴 select문을 단순화, 보안 강화, 자료의 독립성 확보가 가능하다.
형식) create [or replace] view 뷰파일명 as select문 / alter view ~ , drop view ~
뷰를 사용하는 이유
CREATE TABLE 테이블 명 AS SELECT 조건;
이렇게 SQL문을 작성한다면, 조건에 맞는 물리적인 테이블을 생성하므로 메모리 소모가 크다.
그러므로 조건에 맞는 테이블을 생성하는 것보다 뷰를 생성하여 테이블처럼 사용한다.
HeidiSQL의 아이콘으로 봐도 뷰와 테이블은 다르다. v_a가 뷰이고 나머지는 테이블이다.
CREATE OR REPLACE VIEW v_a AS
SELECT jikwon_no,jikwon_name,jikwon_pay FROM jikwon WHERE jikwon_ibsail < '2010-12-31';
SHOW TABLES; -- 테이블은 아니지만 테이블처럼 나타남
DESC v_a;
SELECT * FROM v_a; -- 위에서 작성한 select의 조건을 실행 - 대상 테이블은 jikwon
SELECT COUNT(*) AS 인원수 from v_a;
CREATE OR REPLACE VIEW v_b AS
SELECT * FROM jikwon WHERE jikwon_name LIKE '김%' OR jikwon_name LIKE '박%';
SELECT * FROM v_b;
SELECT jikwon_name,jikwon_pay * 0.5 AS tex FROM v_b WHERE buser_num IN(10,30);
ALTER TABLE jikwon RENAME mbc;
SELECT * FROM mbc;
SELECT * FROM v_a; -- 원본이 없어져서 (이름 바뀌어서) 뷰 실행 x
SELECT * FROM v_b;
ALTER TABLE mbc RENAME jikwon; -- 다시 뷰 살아남
SELECT * FROM v_b;
CREATE OR REPLACE VIEW v_c AS
SELECT SUBSTRING(jikwon_name,2,2) AS irum,jikwon_pay AS pay,jikwon_pay*10000 AS ypay FROM jikwon
ORDER BY jikwon_pay DESC;
SELECT * FROM v_c;
CREATE OR REPLACE VIEW v_e AS
SELECT jikwon_no,jikwon_name,jikwon_jik,jikwon_pay,jikwon_pay / 12 AS bonus FROM jikwon
WHERE jikwon_jik IN ('부장','과장');
SELECT * FROM v_e;
CREATE OR REPLACE VIEW v_d AS
SELECT irum,pay,ypay FROM v_c WHERE pay >= 7000;
-- 뷰파일로 뷰 만들 수 있음
SELECT * FROM v_d;
UPDATE v_e SET jikwon_name = '박치기' WHERE jikwon_name = '한송이'; -- 한송이 -> 박치기
SELECT * FROM v_e;
SELECT * FROM v_b; -- v_e를 바꾼건데 v_b 도 이름 바뀜
SELECT * FROM v_c; -- v_e를 바꾼건데 v_c 도 이름 바뀜
SELECT * FROM jikwon; -- upadate 대상은 jikwon
DELETE FROM v_e WHERE jikwon_no = 7; -- delete 대상은 jikwon
SELECT * FROM v_e;
SELECT * FROM jikwon;
UPDATE v_e SET bonus = 123 WHERE jikwon_no = 3; -- 계산에 의해 작성된 칼럼은 update 대상이 아님
CREATE OR REPLACE VIEW v_f AS
SELECT jikwon_no,jikwon_name,buser_num,jikwon_pay,jikwon_ibsail FROM jikwon
WHERE jikwon_ibsail >= '2015-1-1';
SELECT * FROM v_f;
INSERT INTO v_f VALUES (33,'신기루',30,6666,'2020-12-1');
INSERT INTO v_f VALUES (34,'한가해',20,5555,'2010-12-1');
-- v_f의 조건에 안맞기 때문에 안보임 하지만 insert 된거임 / jikwon 테이블 (원본)에는 있음
SELECT * FROM v_f;
SELECT * FROM jikwon;
CREATE OR REPLACE VIEW v_g AS
SELECT jikwon_jik, SUM(jikwon_pay) AS hap, AVG(jikwon_pay) AS ave FROM jikwon
GROUP BY jikwon_jik;
SELECT * FROM v_g; -- insert, update, delete 안됨. select만 가능
CREATE OR REPLACE VIEW v_h AS
SELECT jikwon_no,jikwon_name,buser_name,jikwon_jik FROM jikwon
INNER JOIN buser ON buser_no = buser_num WHERE buser_num IN (10,20);
SELECT * FROM v_h; -- 선택적인 업데이트 가능