mysql视图知识点(补充ALGORITHM = MERGE/TEMPTABLE/UNDEFINED)

mysql视图知识点(补充ALGORITHM = MERGE/TEMPTABLE/UNDEFINED)

直接po代码

#mysql中视图知识点补充

#查看表结构
DESC book;
#修改表结构,添加一列,添加到bName列的后面
ALTER TABLE book ADD author VARCHAR(50) AFTER bName;
#修改表结构,添加一列,并且放在最前面
ALTER TABLE book ADD publish VARCHAR(40) FIRST;
#修改列
ALTER TABLE book CHANGE publish publishers VARCHAR(60) FIRST;
#删除列
ALTER TABLE book DROP publishers;
#查看表结构
DESC book;

CREATE TABLE book3 LIKE book;
SELECT * FROM book3;
DESC book3;
INSERT INTO book3 SELECT * FROM book;
SELECT * FROM book3;

#视图VIEW
#视图是由查询结果形成的一张虚拟表
#视图的创建语法 CREATE VIEW 视图名 AS SELECT语句;
CREATE VIEW view1 AS SELECT * FROM book WHERE price > 80;
SHOW TABLES;
SELECT * FROM view1;

#修改视图
ALTER VIEW view1 AS SELECT * FROM book WHERE price > 90;
SELECT * FROM view1;

/*
视图的作用
1.可以简化查询
2.可以进行权限控制
3.大数据分表时可以用到
比如:表的行数超过200万行时,就会变慢
可以把一张表的数据拆成4张表来存放
比如:新闻表news
news表
newsid 比如newsid为17,32,63,84
news1表,news2表,news3表,news4表
把一张表的数据分散到4张表里,分散的方法很多
最常用方式可以使用id取模来计算
newsid%4+1=[1,2,3,4]

比如newsid为17
17%4+1=2
那么表名就是"news"+"2"
SELECT * FROM news2 WHERE newsid = 17;

还可以使用视图,把4张表形成一张视图
CREATE VIEW v_news AS 
SELECT * FROM news1 UNION
SELECT * FROM news2 UNION
SELECT * FROM news3 UNION SELECT * FROM news4;
*/


/*
视图和表的关系
视图是表的查询结果,如果表的数据改变了,那么自然会影响视图的结果
反之呢?

*/
#
SELECT * FROM view1;
UPDATE book SET price = 166.57 WHERE bid = 3;
SELECT * FROM view1;
#1.对视图的增删改也会影响表
UPDATE view1 SET price = 188.23 WHERE bid = 3;
SELECT * FROM book;

#
CREATE VIEW view2 AS SELECT btypeid,avg(price) AS avg_price FROM book GROUP BY btypeid;
SELECT * FROM view2;
#2.但是视图并不是总能增删改
UPDATE view2 SET avg_price = 137.98 WHERE btypeid = 10;

/*

视图的数据与表的数据一一对应时,可以修改
还有一点要注意:视图在INSERT插入数据时,视图必须包含表中没有默认值的列

*/

#
CREATE VIEW view3 AS
SELECT bid, bName,price, bTypeId FROM book ORDER BY bTypeId ASC, price DESC;

/*
以下这条sql语句在mysql数据库中执行不会报错(虽然这样写不会报错,但查询结果没什么意义)
MYSQL对 GROUP进行了非ANSI标准的扩展,允许这种select 后含有非 group by 中的列
*/
SELECT bid, bName,price, bTypeId FROM book GROUP BY bTypeId;
#mysql数据库中允许这种select 后含有非 group by 中的列
SELECT * FROM view3 GROUP BY bTypeId;
SELECT * FROM view3;
##mysql数据库中允许这种select 后含有非 group by 中的列
SELECT bid, bName,price, bTypeId FROM book GROUP BY bTypeId ORDER BY bTypeId ASC, price DESC;

/*
视图的ALGORITHM
ALGORITHM = MERGE/TEMPTABLE/UNDEFINED
MERGE:当使用视图时,会把查询视图的语句和创建视图的语句合并起来,形成一条语
句,最后再从基表中查询

TEMPTABLE:当使用视图时,会把创建视图的语句的查询结果当成一张临时表,再从临时表中进行筛选

UNDEFINED:未定义,自动,让系统帮你选

*/

#比较TEMPTABLE和MERGE的区别

#使用ALGORITHM=TEMPTABLE
CREATE ALGORITHM=TEMPTABLE VIEW view4 AS
SELECT bid, bName,price, bTypeId FROM book ORDER BY bTypeId ASC, price DESC;

#
SELECT * FROM view4;
#查询结果为bid是3和6
SELECT * FROM view4 GROUP BY bTypeId;

#使用ALGORITHM=MERGE
CREATE ALGORITHM=MERGE VIEW view5 AS
SELECT bid, bName,price, bTypeId FROM book ORDER BY bTypeId ASC, price DESC;

#
SELECT * FROM view5;
#查询结果为bid是1和5
SELECT * FROM view5 GROUP BY bTypeId;

 

你可能感兴趣的:(mysql视图知识点(补充ALGORITHM = MERGE/TEMPTABLE/UNDEFINED))