MySQL基础知识五—视图以及视图算法视图
视图:view,是⼀种有结构(有⾏有列),但是没有结果的虚拟表,
虚拟表的结构来源不是 ⾃⼰定义的,⽽是来源于(select)对应基表中产⽣的。
创建视图
基表语法:
Create view 视图的名称  as select 语句
后⾯的跟的select语句,可以是普通的查询,也可以是连接查询,也可以是联合查询,⼦查询
创建单表视图:基表只有⼀个
创建多表视图:基表有多个。
先准备数据
CREATE TABLE emp(
empno INT COMMENT '员⼯编号',
ename VARCHAR(50) COMMENT '员⼯名字',
job VARCHAR(50) COMMENT '职位',
mgr INT COMMENT '领导编号',
hiredate DATE COMMENT '⼊职⽇期',
sal DECIMAL(7,2) COMMENT '⽉薪',
comm DECIMAL(7,2) COMMENT '奖⾦',
deptno INT COMMENT '部门编号'
);
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30); INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); INSERT INTO emp VALUES(
7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20); INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10); INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20); INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30); INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
CREATE TABLE dept(
deptno INT COMMENT '部门编号',
dename VARCHAR(100)  COMMENT '部门名称',
loc VARCHAR(50) COMMENT '部门所在地'
)
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES(30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES(40, 'OPERATIONS', 'BOSTON');
建⽴视图⼀张表
syntaxerror是什么错误
CREATE VIEW my_view1 AS
SELECT
*
dba是指数据库的什么FROM
emp;
CREATE VIEW my_view2 ASruby教程妆容
SELECT
*
FROM
dept;
建⽴视图多张表
e.*,d.dename,d.loc
FROM
emp AS e
LEFT JOIN
dept AS d
ON
e.deptno = d.deptno;
注意
table manners in chinese culture
在建⽴多基表视图时,要注意,字段不能重复,也就是列不能重复查看视图
查看视图:查看视图的结构
视图是⼀张虚拟表,表的查看⽅式都适⽤于视图
Show tables 【like ‘patter’】
Desc 视图名称
Show create table 视图名
SHOW TABLES;
SHOW CREATE TABLE my_view1;
DESC my_view1;
SHOW CREATE VIEW my_view1;
使⽤视图
SELECT * FROM my_view1;
SELECT * FROM my_view3;
视图的执⾏:其实本质就是执⾏封装的Select语句
修改视图
视图本⾝是不可修改的,但是可以修改视图的来源
修改视图:修改视图来源select语句
Alter view 视图的名称  as 新的select语句
mysql语句的执行顺序ALTER VIEW my_view1 AS
SELECT
empno,ename,job,hiredate,sal,comm,deptno
FROM
emp;
删除视图
Drop view 视图的名称
*
FROM
dept;
DROP VIEW my_view12;
视图意义
(1)视图可以节约SQL语句:将⼀条复杂的查询语句使⽤视图进⾏保存,以后可以直接对视图进⾏操作。
(2)数据安全:视图的操作主要是针对查询,如果对视图结果进⾏处理(删除),不会对影响基表的数据(相对安全)
(3)视图往往在⼤项⽬中使⽤,⽽且是多系统使⽤:可以对外提供有⽤的数据,但是隐藏关键(⽆⽤)的数据:数据安全。        (4)视图可以对外提供友好型:不同的视图提供不同的数据,对外专门设计。
视图数据操作
视图的确可以进⾏数据写操作的,但是有很多限制。
新增数据
可以向单表视图插⼊数据:插⼊的字段,必须包含所有⾮空字段。安装mysql时未将对象引用设置到
可以向视图插⼊数据,以此同时基表也插⼊数据了
多基表的视图不可以插⼊数据
INSERT INTO my_view1 VALUES (7935,'kkk','xxx',
'1999-09-09',2000,10,10);
SELECT * FROM emp;
SELECT * FROM my_view1;
删除数据
1、多表视图不能删除数据
2、单表视图可以删除数据
DELETE FROM my_view1 WHERE empno = 7935;
SELECT * FROM emp;
SELECT * FROM my_view1;
更新数据
理论上不管是单表视图还是多表视图,数据都是可以更新
视图的更新,会导致基本数据的更新
单表更新
UPDATE
my_view1
SET
hiredate = '2019-2-2'
WHERE
empno = 7934;
SELECT * FROM emp;
SELECT * FROM my_view1;
多表更新
UPDATE
my_view3
SET
hiredate = '2019-2-20'
WHERE
empno = 7934;
SELECT * FROM emp;
SELECT * FROM my_view3;
更新限制
With check option:视图在更新数据的时候,可以限制字段的更新,可以给定限定条件⽐如员⼯表的⼯资,⼯资是不低于2000
CREATE VIEW my_view4 AS
SELECT
*
FROM
emp
WHERE
sal > 2000 WITH CHECK OPTION;
UPDATE my_view4 SET sal = 1000 WHERE empno = 7902;
这时如果执⾏下⾯的更新语句,就会报错
视图算法
通过⼀个案例来接触视图算法
出各个部门⼯资最⾼的那个⼈
使⽤⼦查询实现
(1)按照⼯资降序
(2)按照部门分组