视图是虚拟的表,它们包含的不是数据而是根据需要检索数据的查询。视图提供了一种SELECT语句的封装,用来简化数据处理以及重新格式化基础数据或保护基础数据。
目录
视图
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
比如:如果想查询某个歌手下的所有歌曲,所以使用了两表联结,SQL如下:
SELECT
player_singler.id,
player_singler.name,
player_singe.name AS sname,
player_singe.addtime
FROM
player_singe,
player_singler
WHERE
player_singe.singler_id = player_singler.id
AND player_singler.name = '周杰伦'
任何人想使用上述的SQL语句,查询某个歌手下的歌曲都必须理解相关表结构,并且知道如何创建查询和对表进行联结。为了查询其他歌手,必须修改最后的where子句。
但是通过把整个查询包装成一个名为play_singe_singler的虚拟表,则可以轻松的查询出相同的数据,如下:
SELECT
id,
name,
sname
FROM
play_singe_singler
WHERE
NAME = '周杰伦'
这就是视图的作用。play_singe_singler是一个视图,不包含表中应该有的任何列或数据,它包含的是一个SQL查询(与用以正确联结表的相同的查询)。
为什么使用视图
视图的一些常见应用:
1.重用SOL语句。
2.简化复杂的SQL操作。在编写查询后,可以更方便地重用它而不用探究查询细节。
3.使用表的组成部分而不是整个表。
4.保护数据。可以给用户授权表的特定部分的访问权限。
5.更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据(添加和更新数据存在某些限制)。因为它们返回的数据是从其他表中检索出来的,在添加或更改这些表中的数据时,视图的数据也将改变。
视图的规则和限制
视图创建和使用的常见规则和限制:
1.与表一样,视图必须唯一命名(不能与视图或表名称重复)。
2.创建的视图数目没有限制。
3.创建视图,必须具有足够的访问权限。
4.视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。
5.ORDERBY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDERBY,那么该视图中的ORDERBY将被覆盖。
6.视图不能索引,也不能有关联的触发器或默认值。
7.视图可以和表一起使用。如:编写一条表和视图联结的SELECT语句。
使用视图
在理解视图和视图的规则、限制后,查看如何创建视图。
创建视图
1.视图用CREATE VIEW语句来创建。
2.使用SHOW CREATE VIEW viewname;来查看创建视图的语句
3.用DROP删除视图,其语法为DROP VIEW viewname;
4.更新视图时,可以先用DROP再用CREATE,也可以直接用CREATEOR REPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创建一个视图;如果要更新的视图存在,则第2条更新语句会替换原有视图。
简化复杂的联结
视图最常用的应用之一是隐藏复杂的SQL,这通常都会涉及联结。如下:
CREATE VIEW play_singe_singler AS SELECT
player_singler.id,
player_singler.name,
player_singe.name AS sname,
player_singe.addtime
FROM
player_singe,
player_singler
WHERE
player_singe.singler_id = player_singler.id;
这条语句创建一个名为play_singe_singler的视图,它联结两个表,返回任意单曲的所有歌手列表。如果执行SELECT * FROM play_singe_singler,将列出任意单曲的歌手列表。
比如查询歌手周深的单曲,可如下进行:
SELECT
id,
name,
sname
FROM
play_singe_singler
WHERE
name = '周深';
运行结果:
重新格式化检索出的数据
视图的另一个常见应用是重新格式化检索出的数据。下面的SELECT语句在单个组合计算列中返回歌手和单曲格式化数据。
SELECT
player_singler.id,
concat(player_singe.name, '(', player_singler.name, ')') as title
FROM
player_singe,
player_singler
WHERE
player_singe.singler_id = player_singler.id;
运行结果:
假如经常需要这个格式的结果。就可以创建一个视图,每次需要时使用它即可。
此语句转换为视图,可按如下进行:
CREATE VIEW play_singe_singler2 AS SELECT
player_singler.id,
concat(player_singe.name, '(', player_singler.name, ')') as title
FROM
player_singe,
player_singler
WHERE
player_singe.singler_id = player_singler.id;
还是使用CREATE VIEW方式查询创建视图。
创建后检索数据,即可按照如下方式进行:
SELECT * FROM play_singe_singler2;
过滤数据
还可以定义一个singlermanysinge视图,它过滤掉单曲少于2个的歌手。
为达到此目的,可使用以下语句:
CREATE VIEW singlermanysinge AS SELECT
id,
NAME,
singe_num
FROM
player_singler
WHERE
singe_num > 1;
这样在使用SELECT语句:SELECT * FROM singlermanysinge查询时,
即可过滤掉单曲少于2首的歌手,返回的都是大于1首的歌手列表,如下图:
提示:如果从视图检索数据时又使用了一条where子句,则两组子句将自动组合。
视图计算字段
视图对于简化计算字段的使用也特别有用。下面介绍一条SELECT语句,它检索某个特定订单中的物品,计算每个物品的总价格:
SELECT
orderNum,
price,
num,
price * num AS product_price
FROM
`product_order_spare`;
运行结果:
将其转换为一个视图,按如下进行:
CREATE VIEW orderproductprice AS SELECT
orderNum,
price,
num,
price * num AS product_price
FROM
`product_order_spare`;
创建视图后,如想检索订单编号为20210224140918225910订单的产品信息时,
可按如下进行:
SELECT * FROM orderproductprice WHERE orderNum = '20210224140918225910';
运行结果:
删除视图
删除视图与删除表语句相似,都是使用DROP,不过后面跟的是VIEW。如下:
DROP VIEW play_singe_singler;
总结
视图是虚拟的表,它们包含的不是数据而是根据需要检索数据的查询。
视图提供了一种SELECT语句的封装,用来简化数据处理以及重新格式化基础数据或保护基础数据。