视图增删改查

#视图
/*
含义:虚拟表,和普通表一样使用(可以理解为超大的起别名或封装函数)
      不保存真实的数据,只保存SQL逻辑
语法:
	create view 视图名
	as
	select 列名
	from 表1
	【连接类型】join 表2
	on 连接条件
	【where筛选条件】
	。。。
	;
	
具备以下特点的视图不允许更新:
	1、包含以下关键字的SQL语句:分组函数、distinct、group by、having、union、union all
	2、常量视图
	3、select中包含子查询
	4、join(连接  92 用,)
	5、from 一个不能更鄂新的视图
	6、where子句的子查询引用了from子句中的表(from、where用了同一个表)
	
视图和表的对比:
		    关键字		是否占用物理空间		使用功能
	视图	     view		占用一小部分(保存逻辑)	增删改查,一般只能查
	表	     table		占用				增删改查
*/ 
#一、视图的创建和使用
-- -------------------------------------------------------
#案例1、查询姓张的学生名和专业名
-- ----------以往方式查询-------------
SELECT 
  `studentname`,
  `majorname` 
FROM
  `student` AS s 
  INNER JOIN `major` AS m 
    ON s.`majorid` = m.`majorid` 
WHERE s.`studentname` LIKE '张%' ;

-- ----------使用视图-----------------
CREATE VIEW s_m            #先创建视图
AS
SELECT `studentname`,`majorname`
FROM `student` AS s
INNER JOIN `major` AS m
ON s.`majorid`=m.`majorid`;

SELECT `studentname`,`majorname`
FROM s_m
WHERE `studentname` LIKE '张%';         #调用视图

-- ----------------------------------------------------
#案例2、查询姓名中包含a的员工名,部门名和工种信息
#创建
CREATE VIEW mydeg
AS
SELECT `last_name`,`department_name`,`job_title`
FROM `departments` AS d
INNER JOIN `employees` AS e ON d.`department_id`=e.`department_id`
INNER JOIN `jobs` AS j ON e.`job_id`=j.`job_id`;

#使用
SELECT `last_name`,`department_name`,`job_title`
FROM mydeg
WHERE `last_name` LIKE '%a%';

-- --------------------------------------------------
#案例2、查询各部门的平均工资级别
-- -----------用子查询实现--------------
SELECT av.`department_id`,`grade_level`
FROM `job_grades` AS jg
INNER JOIN(
	SELECT `department_id`,AVG(`salary`) AS avs
	FROM `employees`
	GROUP BY `department_id`) AS av
ON av.avs BETWEEN jg.`lowest_sal` AND jg.`highest_sal`;

-- -----------用视图实现-----------------
#创建
CREATE VIEW myv2
AS
SELECT `department_id`,AVG(`salary`) AS avs
	FROM `employees`
	GROUP BY `department_id`;

#使用	
SELECT myv2.`avs`,g.`grade_level`
FROM myv2
INNER JOIN `job_grades` AS g
ON myv2.`avs` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

-- ---------------------------------------------
#案例3、查询平均工资最低的部门信息
SELECT * FROM myv2
WHERE avs=(SELECT MIN(avs) FROM myv2);  #子查询+视图

SELECT d.*,myv2.`avs`
FROM myv2
INNER JOIN `departments` AS d
ON d.`department_id`=myv2.`department_id`
WHERE avs=(SELECT MIN(avs) FROM myv2); 
-- ------------------------------------------
SELECT * FROM myv2 ORDER BY avs LIMIT 1;  #限制+视图

SELECT d.*,myv2.`avs`
FROM myv2
INNER JOIN `departments` AS d
ON d.`department_id`=myv2.`department_id`
ORDER BY avs LIMIT 1;

-- ---------------------------------------------------------
#案例4、查询平均工资最低的部门名和工资
#创建视图-------支持视图嵌套---------
CREATE VIEW myv3
AS 
SELECT * FROM myv2 ORDER BY avs LIMIT 1;
#使用视图-------支持起别名-----------
SELECT d.`department_name`,m.`avs`
FROM myv3 AS m
INNER JOIN `departments` AS d
ON d.`department_id`=m.`department_id`;


#二、视图的修改
-- -------------------------------------------------------
/*
方式一:
	create or replace view  视图名
	as
	查询语句;
*/

-- --------方式一演示--------------
CREATE OR REPLACE VIEW myv3
AS 
SELECT AVG(`salary`),`job_id`
FROM `employees`
GROUP BY `job_id`;

-- ----------------------------------------------------------
/*
方式二:
	alter view  视图名
	as
	查询语句;
*/
-- --------方式二演示--------------
ALTER VIEW myv3
AS 
SELECT * FROM `job_grades`;

SELECT * FROM myv3;


#三、视图的删除
-- -------------------------------------------------------
/*
语法:
	drop view 视图1,视图2......;
*/
DROP VIEW myv1,myv2,myv3;


#四、查看视图
-- --------------------------------------------------------
#1、desc
DESC myv3;
#2、show
SHOW CREATE VIEW myv3;


#五、视图的更新
-- --------------------------------------------------------
CREATE OR REPLACE VIEW myv1
AS 
SELECT `last_name`,`email`,salary*12*(1+IFNULL(commission_pct,0)) AS "annual salary"
FROM `employees`;

CREATE OR REPLACE VIEW myv1
AS 
SELECT `last_name`,`email`
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`='潘花花';

-- ---------------------------------

SELECT * FROM myv1;
SELECT * FROM `employees`;



你可能感兴趣的:(视图增删改查)