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;




猜你喜欢

转载自blog.csdn.net/weixin_44820625/article/details/106028693