MySQL數據庫----視圖詳解

#視圖:
/*
含義:虛擬表,和普通的表一樣使用
mysql5.1版本出現的新特性,是通過表動態生成的數據

比如:舞蹈班和普通班級的對比

視圖和表的對比

	創建關鍵字	是否佔用了物理空間	使用
	
視圖	create view	只保存了sql邏輯		增刪改查,一般不做增刪改

表	create table	保存了數據		增刪改查


*/

#案例:查詢姓張的學生名和專業名
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`=m.`id`
WHERE s.`stuname` LIKE '張%';

CREATE VIEW v1
AS #有點封裝的意思
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`=m.`id`
WHERE s.`stuname` LIKE '張%';

#一、創建視圖

/*
語法:
create view 視圖名
as
查詢語句;

*/
USE myemployees;

#1、查詢姓名中包含a字符的員工名、部門名和工種信息
#①創建
CREATE VIEW v1
AS
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id =d.department_id
JOIN jobs j ON j.job_id = e.job_id;

#②使用

SELECT * FROM v1 WHERE  last_name LIKE '%a%';


#2、查詢平均工資最低的部門
#視圖可以相互嵌套,但是創建視圖時不能嵌套子查詢


#下面的代碼是錯誤的
CREATE VIEW v22
AS
SELECT d.*
FROM departments d
JOIN employees e ON e.`department_id`=d.`department_id`
GROUP BY department_id
HAVING AVG(salary)= (
	SELECT MIN(平均工資)
	FROM (
		SELECT AVG(salary) 平均工資,department_id
		FROM employees
		GROUP BY department_id
	) 新表
);


#二、視圖的修改

#方式一、
/*
如果沒有,則創建這個視圖,如果有,則把修改這個視圖

create or replace view 視圖名
as
查詢語句;


*/

#二、方式二

/*
alter view 視圖名
as
查詢語句;

*/

#三、刪除視圖

/*
語法:drop view 視圖名,視圖名....

*/
DROP VIEW v2;

#四、查看視圖

DESC v1;

#五、視圖的更新

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0))  "annual salary"
FROM employees;

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees;

SELECT * FROM myv1;
SELECT * FROM employees;

#1、插入
INSERT INTO myv1 VALUES('張飛','[email protected]');

#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 OR REPLACE VIEW myv1
AS
SELECT MAX(salary) m,department_id
FROM employees
GROUP BY department_id;

SELECT * FROM myv1;

#更新   沒有權限,無法更新
UPDATE myv1 SET m=9000 WHERE department_id=10;


#②常量視圖

CREATE OR REPLACE VIEW myv2
AS
SELECT 'join' NAME;

SELECT * FROM myv2;

#更新 沒有權限,無法更新

UPDATE myv2 SET NAME='luvy';

#③select中包含子查詢

CREATE OR REPLACE VIEW myv3
AS
SELECT (SELECT MAX(salary) FROM employees) 最高工資;

#更新
SELECT * FROM myv3;
UPDATE myv3 SET 最高工資=10000;




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章