1. 程式人生 > 實用技巧 >lyt經典版MySQL基礎——檢視

lyt經典版MySQL基礎——檢視

  1 #檢視
  2 /*
  3 含義:虛擬表,和普通表一樣使用
  4 mysql5.1版本出現的新特性,是通過表動態生成的資料
  5 
  6 比如:舞蹈班和普通班的對比
  7 
  8 
  9     建立語法的關鍵字    是否實際佔用物理空間    使用
 10 檢視    create view        只是儲存了sql邏輯    增刪改查,一般不能增刪改
 11 表    create table        儲存了資料        增刪改查
 12 
 13 */
 14 
 15 #案例:查詢姓張的學生名和專業名
 16 SELECT stuname,majorname
17 FROM stuinfo s 18 INNER JOIN major m ON s.majorid = m.id 19 WHERE s.stuname LIKE '張%'; 20 21 CREATE VIEW v1 22 AS 23 SELECT stuname,majorname 24 FROM stuinfo s 25 INNER JOIN major m ON s.majorid = m.id; 26 27 SELECT * FROM v1 WHERE s.stuname LIKE '張%'; 28 29 #一、建立檢視 30 /* 31 create view 檢視名
32 as 33 查詢語句; 34 35 */ 36 USE myemployees; 37 #1.查詢姓名中包含a字元的員工名、部門名和工種資訊 38 #(1)建立 39 CREATE VIEW myv1 40 AS 41 SELECT last_name,department_name,job_title 42 FROM employees e 43 JOIN departments d ON e.department_id=d.department_id 44 JOIN jobs j ON e.job_id=j.job_id; 45 #(2)使用 46 SELECT
* FROM myv1 47 WHERE last_name LIKE '%a%'; 48 49 #2.查詢各部門的平均工資級別 50 CREATE VIEW myv2 51 AS 52 SELECT AVG(salary) avs,department_id 53 FROM employees 54 GROUP BY department_id; 55 56 SELECT grade_level,department_id FROM job_grades j 57 JOIN myv2 m ON m.avs BETWEEN j.lowest_sal AND j.highest_sal; 58 59 #3.查詢平均工資最低的部門資訊 60 SELECT * FROM departments d 61 JOIN myv2 m ON d.department_id=m.department_id 62 ORDER BY m.avs ASC LIMIT 1; 63 #4.查詢平均工資最低的部門名和工資 64 CREATE VIEW myv3 65 AS 66 SELECT * FROM myv2 ORDER BY avs LIMIT 1; 67 68 SELECT department_name,avs FROM 69 departments d JOIN myv3 m ON d.department_id=m.department_id; 70 71 #二、檢視的修改 72 #方式一: 73 /* 74 create or replace view 檢視名 75 as 76 查詢語句; 77 */ 78 79 SELECT * FROM myv3; 80 81 CREATE OR REPLACE VIEW myv3 82 AS 83 SELECT AVG(salary),job_id 84 FROM employees 85 GROUP BY job_id; 86 87 #方式二: 88 /* 89 語法: 90 alter view 檢視名 91 as 92 查詢語句; 93 */ 94 ALTER VIEW myv3 95 AS 96 SELECT * FROM employees; 97 98 #三、刪除檢視 99 /* 100 語法:drop view 檢視名,檢視名,...; 101 */ 102 DROP VIEW myv1,myv2,myv3; 103 104 #四、檢視檢視 105 DESC myv3; 106 107 SHOW CREATE VIEW myv3; -- 在mysql客戶端裡使用比較方便 108 109 #五、檢視的更新 110 CREATE OR REPLACE VIEW myv1 111 AS 112 SELECT last_name,email 113 FROM employees; 114 115 SELECT * FROM myv1; 116 SELECT * FROM employees; 117 #1.插入 118 INSERT INTO myv1 VALUES('張飛','[email protected]'); 119 #2.修改 120 UPDATE myv1 SET last_name='張無忌' WHERE last_name='張飛'; 121 #3.刪除 122 DELETE FROM myv1 WHERE last_name='張無忌'; 123 124 #具備以下特點的檢視不允許更新 125 #(1)包含以下關鍵字的sql語句:分組函式、distinctgroup byhaving、union或者union all 126 CREATE OR REPLACE VIEW myv1 127 AS 128 SELECT MAX(salary) m,department_id 129 FROM employees 130 GROUP BY department_id; 131 132 SELECT * FROM myv1; 133 #更新 134 UPDATE myv1 SET m=9000 WHERE department_id=10; -- 不允許更新 135 136 #(2)常量檢視 137 CREATE OR REPLACE VIEW myv2 138 AS 139 SELECT 'john' NAME; 140 141 SELECT * FROM myv2; 142 #更新 143 UPDATE myv2 SET NAME='lucy'; -- 常量檢視不允許更新 144 145 #(3)select中包含子查詢 146 CREATE OR REPLACE VIEW myv3 147 AS 148 SELECT (SELECT MAX(salary) FROM employees) 最高工資; 149 150 #更新 151 SELECT * FROM myv3; 152 UPDATE myv3 SET 最高工資=10000; -- 包含子查詢的select語句不允許更新 153 154 #(4)join 155 CREATE OR REPLACE VIEW myv4 156 AS 157 SELECT last_name,department_name 158 FROM employees e 159 JOIN departments d ON e.department_id=d.department_id; 160 161 #更新 162 SELECT * FROM myv4; 163 UPDATE myv4 SET last_name='張飛' WHERE last_name='Whalen'; 164 INSERT INTO myv4 VALUES('陳真','xxxx'); -- 有join的不能插入(更新) 165 166 #(5)from一個不能更新的檢視 167 CREATE OR REPLACE VIEW myv5 168 AS 169 SELECT * FROM myv3; 170 171 #更新 172 SELECT * FROM myv5; 173 UPDATE myv5 SET 最高工資=10000 WHERE department_id=60; -- from一個不能更新的檢視的,不能更新 174 175 #(6)where子句的子查詢引用了from子句中的表 176 CREATE OR REPLACE VIEW myv6 177 AS 178 SELECT last_name,email,salary 179 FROM employees 180 WHERE employee_id IN ( 181 SELECT manager_id FROM employees 182 WHERE manager_id IS NOT NULL 183 ); 184 185 SELECT * FROM myv6; 186 #更新 187 UPDATE myv6 SET salary=10000 WHERE last_name='K_ing'; -- 不允許更新