没有合适的资源?快使用搜索试试~ 我知道了~
首页mysql视图之创建视图(CREATE VIEW)和使用限制实例详解
本文实例讲述了mysql视图之创建视图(CREATE VIEW)和使用限制。分享给大家供大家参考,具体如下: mysql5.x 版本之后支持数据库视图,在mysql中,视图的几乎特征符合SQL:2003标准。 mysql以两种方式处理对视图的查询: 第一种方式,MySQL会根据视图定义语句创建一个临时表,并在此临时表上执行传入查询。 第二种方式,MySQL将传入查询与查询定义为一个查询并执行组合查询。 mysql支持版本系统的视图,当每次视图被更改或替换时,视图的副本将在驻留在特定数据库文件夹的arc(archive)文件夹中备份。备份文件的名称为view_name.frm-00001
资源详情
资源评论
资源推荐

mysql视图之创建视图(视图之创建视图(CREATE VIEW)和使用限制实例详)和使用限制实例详
解解
本文实例讲述了mysql视图之创建视图(CREATE VIEW)和使用限制。分享给大家供大家参考,具体如下:
mysql5.x 版本之后支持数据库视图,在mysql中,视图的几乎特征符合SQL:2003标准。 mysql以两种方式处理对视图的查
询:
第一种方式,MySQL会根据视图定义语句创建一个临时表,并在此临时表上执行传入查询。
第二种方式,MySQL将传入查询与查询定义为一个查询并执行组合查询。
mysql支持版本系统的视图,当每次视图被更改或替换时,视图的副本将在驻留在特定数据库文件夹的arc(archive)文件夹中备
份。备份文件的名称为view_name.frm-00001。如果再次更改视图,mysql将创建一个名为view_name.frm-00002的新备份文
件。mysql允许基于其他视图创建视图,就是在视图定义的select语句中,可以引用另一个视图。
好啦,多的咱就不赘述了,接下来咱们尝试使用CREATE VIEW语句创建视图,先来看下语法结构:
CREATE
[ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}] VIEW [database_name].[view_name] AS
[SELECT statement]
然后我们来详细看下上面的sql中的各种词是什么意思。首先,第一个中括号里代表的就是创建视图是的算法属性,它允许我
们控制mysql在创建视图时使用的机制,并且mysql提供了三种算法:MERGE,TEMPTABLE和UNDEFINED。我们来分别看
下:
使用MERGE算法,mysql首先将输入查询与定义视图的select语句组合成单个查询。 然后mysql执行组合查询返回结果集。
如果select语句包含集合函数(如min,max,sum,count,avg等)或distinct,group by,havaing,limit,union,union all,
子查询,则不允许使用MERGE算法。 如果select语句无引用表,则也不允许使用MERGE算法。 如果不允许MERGE算
法,mysql将算法更改为UNDEFINED。我们要注意,将视图定义中的输入查询和查询组合成一个查询称为视图分辨率。
使用TEMPTABLE算法,mysql首先根据定义视图的SELECT语句创建一个临时表,然后针对该临时表执行输入查询。因为
mysql必须创建临时表来存储结果集并将数据从基表移动到临时表,所以TEMPTABLE算法的效率比MERGE算法效率低。 另
外,使用TEMPTABLE算法的视图是不可更新的。
当我们创建视图而不指定显式算法时,UNDEFINED是默认算法。 UNDEFINED算法使mysql可以选择使用MERGE或
TEMPTABLE算法。mysql优先使用MERGE算法进行TEMPTABLE算法,因为MERGE算法效率更高。
然后就是view后面的词组了,它就是名称的意思,在数据库中,视图和表共享相同的命名空间,因此视图和表不能具有相同的
名称。 另外,视图的名称必须遵循表的命名规则。
最后就是SELECT语句了。在SELECT语句中,可以从数据库中存在的任何表或视图查询数据,同时SELECT语句必须遵循以
下几个规则:
SELECT语句可以在where 语句中包含子查询,但FROM子句中的不能包含子查询。
SELECT语句不能引用任何变量,包括局部变量,用户变量和会话变量。
SELECT语句不能引用准备语句的参数。
在这里我们得稍稍注意下,SELECT语句不需要引用任何表。完事呢,我们来尝试基于orderDetails表来创建一个表示每个订
单的总销售额的视图:
CREATE VIEW SalePerOrder AS
SELECT
orderNumber, SUM(quantityOrdered * priceEach) total
FROM
orderDetails
GROUP by orderNumber
ORDER BY total DESC;
我们如果使用SHOW TABLES命令来查看示例数据库(yiibaidb)中的所有表,还会看到SalesPerOrder视图也显示在表的列表
中:
mysql> SHOW TABLES;
+--------------------+
| Tables_in_yiibaidb |
+--------------------+
| article_tags |
| contacts |
| customers |
| departments |
| employees |
| offices |
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0