视图

# 视图
/*
含义:虚拟表,和普通表一样使用
mysql5.1版本出现的新特性,是通过表动态生成的数据

比如:临时班和普通版的对比,视图是一种虚拟存在的表,并没有专门开辟空间存储数据
      只保存sql 逻辑,不保存查询结果
应用场景:
      多个地方用到同样的查询结果
      该查询结果使用的sql语句较复杂
      
视图的优点:    
      重用sql语句
      简化复杂的sql操作,不必知道它的查询细节
      保护数据,提高安全性
            是否实际占用物理空间    使用
视图    create view    n,只是保存了sql逻辑    增删改查,一般不能增删改

表      create table    y,保存了数据        增删改查
*/ #案例: 查询姓张的学生名和专业名 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 '张%'; #直接在创建的视图里查询 SELECT * FROM v1 WHERE stuName LIKE '张%’; #一、 创建视图 /* 语法: create view 视图名 as 查询语句; */


USE employees;

CREATE VIEW myv1
AS

SELECT e.`last_name`, d.`department_name`, j.`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`

#2、使用视图(跟表的查询使用一样)
SELECT * FROM myv1 WHERE last_name LIKE '%a%';

#二、视图的修改

#方式一:
/*
cretate or replace view 视图名
as
查询语句;

*/
CREATE OR REPLACE VIEW myv1
AS
SELECT e.`last_name`, d.`department_name`, j.`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`

#方式二:
/*
语法:
alter view 视图名
as
查询语句;
*/

ALTER VIEW myv1
AS 
SELECT * FROM employees WHERE last_name LIKE '%a%';

#三、删除视图

/*
语法:drop view 视图名,视图名,……;
*/

DROP VIEW myv1, myv2, myv3;

#四、 查看视图

DESC myv1;

SHOW CREATE VIEW myv1;


#五、视图的更新

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

#1.插入
SELECT * FROM myv3;

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

INSERT INTO myv3 VALUE('JJ', 'aa@qq.com');

#2.修改
UPDATE myv3 SET last_name = '吉吉' WHERE last_name = 'JJ';

#3、删除
DELETE FROM myv3 WHERE last_name = '吉吉';


#   1/具备以下关键字的sql语句:分组函数、 diestinct、 group by、having、 union 或unionall



#    2/常量视图

CREATE OR REPLACE VIEW myv4
AS

SELECT 'john' NAME;

#    3/select 中包含子查询
SELECT(seldct MAX(salary) FROM employees) 最高工资;

#    更新
SELECT * FROM myv4;
UPDATE myv3 SET 最高工资=100000;

#     4/join
CREATE last_name, department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id;

#更新

#     5/from 一个不能更新的视图

#     6/where子句的子查询引用了from子句中的表


 

posted @ 2020-02-26 16:44  gupanpan  阅读(135)  评论(0)    收藏  举报