# 视图
/*
含义:虚拟表,和普通表一样使用
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子句中的表