MySQL進階16 - 視圖的創建/修改/刪除/更新--可更新性的不適用條件


#進階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 ='張無忌';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM