§创建视图

在MySQL中,创建视图的完整语法如下:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

其对应的语法变量信息如下:

[OR REPLACE]
中括号中的
OR REPLACE关键字是可选的。如果当前数据库中已经存在指定名称的视图时,没有该关键字,将会提示错误信息;如果使用了
OR REPLACE关键字,则当前正在创建的视图会覆盖掉原来同名的视图。
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
ALGORITHM子句是可选的,它表示使用何种算法来处理视图。此外,它并不属于标准SQL的一部分,而是MySQL对标准SQL进行的功能扩展。
ALGORITHM可以设置三个值:
MERGE
TEMPTABLE
UNDEFINED。如果没有
ALGORITHM子句,则默认值为
UNDEFINED(未定义的)。 对于
MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

之所以提供TEMPTABLE选项,是因为TEMPTABLE在创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。

此外,MERGE算法要求视图中的行和基表中的行具有一对一的关系。如果视图包含聚合函数(SUM(), MIN(), MAX(), COUNT()等)、DISTINCTGROUP BYHAVINGUNIONUNION ALL、没有基表的引用文字值(例如:SELECT 'hello';)等结构中的任何一种,将失去一对一的关系,此时必须使用临时表取而代之。

[(column_list)]
(column_list)用于自定义视图中各个字段的名称。如果没有该命令选项,那么通过视图查询到的各个字段的名称和视图所使用到的数据表的字段名称保持一致。下面是一个常见的用于创建视图的SQL语句:

CREATE OR REPLACE VIEW v_user
AS
SELECT id, username FROM user;

由于user表中的字段名称为idusername,因此视图v_user中的两个字段名称也分别默认为idusername。现在,我们将视图v_user中的字段名称分别自定义为uiduname

CREATE OR REPLACE VIEW v_user (uid, uname)
AS
SELECT id, username FROM user;
select_statement
select_statement用于指定视图的内容定义。简而言之,这里就是用户自定义的一个SELECT语句。
[WITH [CASCADED | LOCAL] CHECK OPTION]
该选项中的
CASCADED为默认值,
LOCAL CHECK OPTION用于在可更新视图中防止插入或更新行。由于此选项一般不使用,因此不再赘述,具体信息请参考MySQL官方网站上的相关信息。

§删除视图

在MySQL中删除视图的方法非常简单,其详细语法如下:

--删除指定名称的一个或多个视图
DROP VIEW [IF EXISTS]
view_name [, view_name2]...

其中,关键字IF EXISTS用于防止因视图不存在而提示出错,此时,只有存在该视图才会执行删除操作。DROP VIEW语句可以一次性删除多个视图,只需要在多个视图名称之间以英文逗号隔开即可。如果多个视图存在于不同的数据库中,不数据当前数据库的视图名称之前还必须加上db_name.前缀。

--删除视图v_user
DROP VIEW v_user;

§修改视图

请参考创建视图语法中的OR REPLACE关键字,只要具备该关键字的视图创建语句就是修改视图的SQL语句。

§查看视图

在MySQL中,show tables不仅可以用于查看当前数据库中存在哪些数据表,同时也可以查看到当前数据库中存在哪些视图。

--执行show tables
mysql> show tables;
--以下是输出结果
+----------------+
| Tables_in_test |
+----------------+
| user |
| v_user |
+----------------+
2 rows in set (0.00 sec)

不过,仅仅使用show tables语句,在输出结果中,我们根本无法区分到底哪些才是视图哪些才是真实的数据表(当然,视图的命名我们可以统一约定以"v_"开头)。此时,我们需要使用命令show full tables,该命令可以列出额外的table_type列,如果对应输出行上该列的值为"VIEW",则表示这是一个视图。

--执行show full tables
mysql> show full tables;
--以下是输出结果
+----------------+------------+
| Tables_in_test | Table_type |
+----------------+------------+
| user | BASE TABLE |
| v_user | VIEW |
+----------------+------------+
2 rows in set (0.00 sec)

当我们通过上述命令找到了我们所需要的视图之后,我们可以使用如下命令查看创建该视图的详细语句:

show create view view_name

例如,我们使用该命令查看创建视图v_user的SQL语句:

--由于该语句的输出结果较为杂乱,因此使用\G命令进行格式化输出
mysql> show create view v_user \G;
--以下是格式化的输出结果
*************************** 1. row ***************************
View: v_user
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_user` AS select `user`.`id` AS `uid`,`user`.`username`
AS `uname` from `user`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

原文地址:https://codeplayer.vip/p/j7sce

MySQL视图操作命令详解的更多相关文章

  1. MySQL索引操作命令详解

    创建索引: MySql创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_ ...

  2. MySQL数据库优化详解(收藏)

    MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * ...

  3. MySQL数据库备份详解

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  4. 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解

    http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...

  5. MySQL 联合索引详解

    MySQL 联合索引详解   联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...

  6. MySQL关闭过程详解和安全关闭MySQL的方法

    MySQL关闭过程详解和安全关闭MySQL的方法 www.hongkevip.com 时间: -- : 阅读: 整理: 红客VIP 分享到: 红客VIP(http://www.hongkevip.co ...

  7. 【转】Nginx+php-fpm+MySQL分离部署详解

    转:http://www.linuxidc.com/Linux/2015-07/120580.htm Nginx+php-fpm+MySQL分离部署详解 [日期:2015-07-26] 来源:Linu ...

  8. 在telnet下操作memcache详解(操作命令详解)

    这篇文章主要介绍了在telnet下操作memcache详解,telnet下的memcache操作命令详解,需要的朋友可以参考下 在定位问题.测试等时候经常需要对memcache的数据进行一些操作,但是 ...

  9. ThinkPHP视图查询详解

    ThinkPHP视图查询详解 参考http://www.jb51.net/article/51674.htm   这篇文章主要介绍了ThinkPHP视图查询,需要的朋友可以参考下     ThinkP ...

随机推荐

  1. noip考前模板复习

    网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...

  2. TCP keepalive的机理及使用

    TCP 是面向连接的 , 在实际应用中通常都需要检测对端是否还处于连接中.如果已断开连接,主要分为以下几种情况: 1.连接的对端正常关闭,即使用 closesocket 关闭连接. 2.连接的对端非正 ...

  3. 【JZOJ4925】【GDOI2017模拟12.18】稻草人

    题目描述 YLOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,YLOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条 ...

  4. objectarx之判断三点是否在一条直线上

    bool CCommonFuntion::IsOnLine(AcGePoint2d& pt1, AcGePoint2d& pt2, AcGePoint2d& pt3){ AcG ...

  5. 笔记:OSAL st 宏学习 do { x } while (__LINE__ == -1)

    笔记:OSAL st 宏学习 do { x } while (LINE == -1) #define st(x) do { x } while (__LINE__ == -1) 这段的意思是让代码可以 ...

  6. 第三十二讲:UML类图(下)

    一个类能够看到另外一个类的属性和方法,那么这两个类是关联的.

  7. Ubuntu18.04+windows10双系统时间同步教程

    前言: 系统安装windows10和Ubuntu18.04双系统后会出现时间不同步的情况,往往windows系统的时间会有错误,一般会有8个小时的误差. 原因: 主要因为本地时间与硬件时间的时差: 本 ...

  8. PLAY2.6-SCALA(三) 数据的返回与保存

    1.修改默认的Content-Type 自动设置内容类型为text/plain val textResult = Ok("Hello World!") 自动设置内容类型为appli ...

  9. 【uml】之用例图中的关系 标签: uml图形 2014-11-23 11:10 1422人阅读 评论(29)

    用例图显示谁是相关的用户,用户希望系统提供什么样的服务(用例),用例之间的关系图,用例图主要的作用是获取需求.指导测试.所以,用例图是站在用户的角度来画的图,应该体现的是用户想要的功能,并不需要体现如 ...

  10. Person Re-identification 系列论文笔记(五):SVD-net

    SVDNet for Pedestrian Retrieval Sun Y, Zheng L, Deng W, et al. SVDNet for Pedestrian Retrieval[J]. 2 ...