1 视图
1.1 视图的概念
- 视图是一个虚拟的表,不同于直接操作数据表,视图是依据SELECT语句来创建的,所以操作视图时会根据创建视图的SELECT语句生成一张虚拟表,然后在这张虚拟表上做SQL操作。
- 【补充】MySQL从5.0.1版本开始提供视图功能。视图只保存了sql逻辑,不保存查询结果。
1.2 视图与表的区别
- 视图与表的区别—“是否保存了实际的数据”。视图并不是数据库真实存储的数据表,它可以看作是一个窗口,通过这个窗口我们可以看到数据库表中真实存在的数据。所以我们要区别视图和数据表的本质,即视图是基于真实表的一张虚拟的表,其数据来源均建立在真实表的基础上。
* - 视图不是表,视图是虚表,视图依赖于表。
类型 | 创建语法的关键字 | 是否实际占用物理空间 | 使用 |
---|---|---|---|
视图 | create view | 只保存sql逻辑 | 一般不能增删改 |
表 | create table | 保存了数据 | 可以增删改查 |
1.3 视图的优点
- 通过定义视图可以将频繁使用的SELECT语句保存以提高效率。
- 通过定义视图可以使用户看到的数据更加清晰。
- 通过定义视图可以不对外公开数据表全部字段,增强数据的保密性。
- 通过定义视图可以降低数据的冗余。
1.4 视图的创建
基本语法:
CREATE VIEW <视图名称>(<列名1>,<列名2>,...) AS <SELECT语句>
- 其中SELECT 语句需要书写在 AS 关键字之后。 SELECT 语句中列的排列顺序和视图中列的排列顺序相同, SELECT 语句中的第 1 列就是视图中的第 1 列, SELECT 语句中的第 2 列就是视图中的第 2 列,以此类推。
- 视图的列名是在视图名称之后的列表中定义的。需要注意的是视图名在数据库中需要是唯一的,不能与其他视图和表重名。
- 视图不仅可以基于真实表,我们也可以在视图的基础上继续创建视图。
【注意】 - 虽然在视图上继续创建视图的语法没有错误,但是我们还是应该尽量避免这种操作。这是因为对多数 DBMS 来说, 多重视图会降低 SQL 的性能。
- 在一般的DBMS中定义视图时不能使用ORDER BY语句。
举个例子:
CREATE VIEW productsum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type
ORDER BY product_type;
【说明】
- 为什么不能使用 ORDER BY 子句呢?这是因为视图和表一样,数据行都是没有顺序的。
- 在 MySQL中视图的定义是允许使用 ORDER BY 语句的,但是若从特定视图进行选择,而该视图使用了自己的 ORDER BY 语句,则视图定义中的 ORDER BY 将被忽略。
1.4.1 基于单表创建
举个例子:
CREATE VIEW productsum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type ;
运行结果:
1.4.2 基于多表创建
举个例子:
CREATE VIEW view_shop_product(product_type, sale_price, shop_name)
AS
SELECT product_type, sale_price, shop_name
FROM product,shop_product
WHERE product.product_id = shop_product.product_id;
1.5 修改视图结构
基本语法:
ALTER VIEW <视图名> AS <SELECT语句>
- 其中视图名在数据库中需要是唯一的,不能与其他视图和表重名。当然也可以通过将当前视图删除然后重新创建的方式达到修改的效果。
举个例子:
ALTER VIEW productSum
AS
SELECT product_type, sale_price
FROM Product
WHERE regist_date > '2009-09-11';
运行结果: