MySQL视图操作命令详解
§创建视图
在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()
等)、DISTINCT
、GROUP BY
、HAVING
、UNION
或UNION ALL
、没有基表的引用文字值(例如:SELECT 'hello';
)等结构中的任何一种,将失去一对一的关系,此时必须使用临时表取而代之。 - [(column_list)]
-
(column_list)
用于自定义视图中各个字段的名称。如果没有该命令选项,那么通过视图查询到的各个字段的名称和视图所使用到的数据表的字段名称保持一致。下面是一个常见的用于创建视图的SQL语句:CREATE OR REPLACE VIEW v_user
AS
SELECT id, username FROM user;由于
user
表中的字段名称为id
和username
,因此视图v_user
中的两个字段名称也分别默认为id
和username
。现在,我们将视图v_user
中的字段名称分别自定义为uid
和uname
。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视图操作命令详解的更多相关文章
- MySQL索引操作命令详解
创建索引: MySql创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_ ...
- MySQL数据库优化详解(收藏)
MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * ...
- MySQL数据库备份详解
原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...
- 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解
http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...
- MySQL 联合索引详解
MySQL 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...
- MySQL关闭过程详解和安全关闭MySQL的方法
MySQL关闭过程详解和安全关闭MySQL的方法 www.hongkevip.com 时间: -- : 阅读: 整理: 红客VIP 分享到: 红客VIP(http://www.hongkevip.co ...
- 【转】Nginx+php-fpm+MySQL分离部署详解
转:http://www.linuxidc.com/Linux/2015-07/120580.htm Nginx+php-fpm+MySQL分离部署详解 [日期:2015-07-26] 来源:Linu ...
- 在telnet下操作memcache详解(操作命令详解)
这篇文章主要介绍了在telnet下操作memcache详解,telnet下的memcache操作命令详解,需要的朋友可以参考下 在定位问题.测试等时候经常需要对memcache的数据进行一些操作,但是 ...
- ThinkPHP视图查询详解
ThinkPHP视图查询详解 参考http://www.jb51.net/article/51674.htm 这篇文章主要介绍了ThinkPHP视图查询,需要的朋友可以参考下 ThinkP ...
随机推荐
- 【风马一族_php】数组函数
原文来自:http://www.cnblogs.com/sows/p/6045699.html (博客园的)风马一族 侵犯版本,后果自负 2016-11-09 15:56:26 数组 函数 php- ...
- LeedCode --- Best Time to Buy and Sell Stock
题目链接 题意: find the maximum positive difference between the price on the ith day and the jth day 附上代码: ...
- KDD2015,Accepted Papers
Accepted Papers by Session Research Session RT01: Social and Graphs 1Tuesday 10:20 am–12:00 pm | Lev ...
- CSS浏览器兼容解决方案
1.在ie8的甑别上,如何让样式只对ie8起作用? 用ie浏览器独有的文档注释的方式.像这样: <!DOCTYPE html> <!--> <html class=&qu ...
- iOS 停止不必要的UI动效设计
http://www.cocoachina.com/design/20151124/14400.html 前言:这篇短文将会探讨UI设计中动画的过度使用,并将其与早期的视觉设计进行对比,提出一些对于有 ...
- SQLAlchemy中filter和filer_by的区别
filter: session.query(MyClass).filter(MyClass.name == 'some name') filter_by: session.query(MyClass) ...
- PyCharm切换Python版本
由于代码格式问题,很多情况下需要我们去切换Python版本,那么在当下火爆的PyCharm中是如何切换Python版本的呢? 打开File菜单,选择Settings: 打开Settings窗口后,选择 ...
- Gulp和webpack的作用和区别
gulp是工具链.构建工具,可以配合各种插件做js压缩,css压缩,less编译 替代手工实现自动化工作 1.构建工具 2.自动化 3.提高效率用 webpack是文件打包工具,可以把项目的各种js文 ...
- 解决Python操作MySQL中文乱码的问题
原始代码: import os, sys, string import MySQLdb MYSQL_HOST = 'localhost' MYSQL_PORT = ' MYSQL_USER = 'ro ...
- Java练习 SDUT-1230_平方和与立方和
平方和与立方和 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇 ...