#進階16 : 視圖 /* 含義: 虛擬表,和普通表一樣使用;(從5.1開始使用的:)是通過表動態生成的數據 創建語法: create view 視圖名 as 查詢語句; ---------- 作用: 重用SQL語句,簡化復雜的sql操作,不必知道它的查詢細節; 保護數據,提高安全性; ------------------------- 視圖的修改: 方式1: create or replace view 視圖名 as 查詢語句; 方法2: alter view 視圖名 as 查詢語句; ---------------------------- 三:視圖的刪除 : 用戶可以一次刪除一個或者多個視圖,前提是必須有該視圖的drop權限。 語法: drop view 視圖名,視圖名,視圖名; ----------------------------- 四:查看視圖 desc v2; ----------------------------- #五: 視圖的更新 CREATE OR REPLACE VIEW myv1 AS SELECT last_name,email FROM employees; SELECT * FROM myv1 ORDER BY last_name DESC; #1.插入 INSERT INTO myv1 VALUES('張飛','zafqq.com'); #2 修改 UPDATE myv1 SET last_name ='張無忌' WHERE last_name='張飛'; #3 刪除 DELETE FROM myv1 WHERE last_name ='張無忌'; -------------------------------------------- #六 視圖的可更新性 視圖的可更新性和視圖中查詢的定義有關系,以下類型的視圖是不能更新的。 • 包含以下關鍵字的sql語句:分組函數、distinct、group by 、having、union或者union all • 常量視圖 • Select中包含子查詢 • join • from一個不能更新的視圖 • where子句的子查詢引用了from子句中的表 --------------------------------------------- 視圖 : create view 沒有占用多少物理空間,只保存sql邏輯 表 : create table 占用了 */ #案例():查詢姓張的學生名和專業名 USE student; SELECT studentname,majorname FROM stuinfo s INNER JOIN major m ON s.`majorid`=m.`majorid` WHERE s.`studentname` LIKE '張%'; #demo1: 創建視圖 ; CREATE VIEW v1 AS SELECT studentname,majorname FROM stuinfo s INNER JOIN major m ON s.`majorid`=m.`majorid` WHERE s.`studentname` LIKE '張%'; #然后從視圖中查找出全部信息; SELECT * FROM v1 WHERE studentname LIKE '張%'; #---------------------------- #1.查詢郵箱中包含a字符的 員工名、部門名和工種信息 CREATE VIEW v2 AS SELECT e.`last_name`,e.`department_id`,j.`job_id`,j.job_title FROM employees e,jobs j WHERE e.`job_id`=j.`job_id` AND email LIKE '%a%'; #② 使用視圖 SELECT * FROM v2 WHERE last_name LIKE '%a%'; #2.查詢各部門的平均工資的級別 CREATE VIEW v3 AS SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id; SELECT v3.department_id,g.`grade_level` FROM v3 JOIN job_grades g ON v3.ag BETWEEN g.`lowest_sal` AND g.`highest_sal`; #3.查詢平均工資最低的部門信息 SELECT * FROM v3 ORDER BY ag LIMIT 1; #4.查詢平均工資最低的部門名和工資 SELECT * FROM `departments` WHERE departments.department_id = ( SELECT department_id FROM v3 ORDER BY ag LIMIT 1 ); #5.視圖的修改(REPLACE)--方式1 CREATE OR REPLACE VIEW v3 AS SELECT MIN(salary) min_ag,department_id FROM employees GROUP BY department_id; SELECT * FROM v3; #6.視圖的修改(alter)--方式2 ALTER VIEW v3 AS SELECT MAX(salary) max_ag,department_id FROM employees GROUP BY department_id; #平均1.00 -- 2400次 SELECT ('28-29兩天scanner sum'),( 865-833+621-523+230-175+3+ 58-41+87-66+4+48-32+7+2+20+31-14+11-9 ),(0.054+0.073); #五: 視圖的更新 CREATE OR REPLACE VIEW myv1 AS SELECT last_name,email FROM employees; SELECT * FROM myv1 ORDER BY last_name DESC; #1.插入 INSERT INTO myv1 VALUES('張飛','zafqq.com'); #2 修改 UPDATE myv1 SET last_name ='張無忌' WHERE last_name='張飛'; #3 刪除 DELETE FROM myv1 WHERE last_name ='張無忌';