如何在MySQL中创建视图?

作者&投稿:蓍骅 (若有异议请与网页底部的电邮联系)
~   CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\x0d\x0a VIEW view_name [(column_list)]\x0d\x0a AS select_statement\x0d\x0a [WITH [CASCADED | LOCAL] CHECK OPTION]\x0d\x0a\x0d\x0a  该语句能创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。select_statement是一种SELECT语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。\x0d\x0a  该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。对于在SELECT语句中其他地方使用的列,必须具有SELECT权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限。\x0d\x0a  视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时,应将名称指定为db_name.view_name。\x0d\x0a  mysql> CREATE VIEW test.v AS SELECT * FROM t;\x0d\x0a\x0d\x0a  表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。\x0d\x0a  视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由SELECT语句检索的列名将用作视图列名。要想为视图列定义明确的名称,可使用可选的column_list子句,列出由逗号隔开的ID。column_list中的名称数目必须等于SELECT语句检索的列数。\x0d\x0a  SELECT语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、操作符等的表达式。\x0d\x0a  对于SELECT语句中不合格的表或视图,将根据默认的数据库进行解释。通过用恰当的数据库名称限定表或视图名,视图能够引用表或其他数据库中的视图。\x0d\x0a  能够使用多种SELECT语句创建视图。视图能够引用基表或其他视图。它能使用联合、UNION和子查询。SELECT甚至不需引用任何表。在下面的示例中,定义了从另一表选择两列的视图,并给出了根据这些列计算的表达式:\x0d\x0a  mysql> CREATE TABLE t (qty INT, price INT);\x0d\x0amysql> INSERT INTO t VALUES(3, 50);\x0d\x0amysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;\x0d\x0amysql> SELECT * FROM v;\x0d\x0a+------+-------+-------+\x0d\x0a| qty | price | value |\x0d\x0a+------+-------+-------+\x0d\x0a| 3 | 50 | 150 |\x0d\x0a+------+-------+-------+\x0d\x0a\x0d\x0a  视图定义服从下述限制:\x0d\x0a  · SELECT语句不能包含FROM子句中的子查询。\x0d\x0a  · SELECT语句不能引用系统或用户变量。\x0d\x0a  · SELECT语句不能引用预处理语句参数。\x0d\x0a  · 在存储子程序内,定义不能引用子程序参数或局部变量。\x0d\x0a  · 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。\x0d\x0a  · 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。\x0d\x0a  · 在视图定义中命名的表必须已存在。\x0d\x0a  · 不能将触发程序与视图关联在一起。\x0d\x0a  在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。\x0d\x0a  对于定义中的其他选项或子句,它们将被增加到引用视图的语句的选项或子句中,但效果未定义。例如,如果在视图定义中包含LIMIT子句,而且从特定视图进行了选择,而该视图使用了具有自己LIMIT子句的语句,那么对使用哪个LIMIT未作定义。相同的原理也适用于其他选项,如跟在SELECT关键字后的ALL、DISTINCT或SQL_SMALL_RESULT,并适用于其他子句,如INTO、FOR UPDATE、LOCK IN SHARE MODE、以及PROCEDURE。\x0d\x0a  如果创建了视图,并通过更改系统变量更改了查询处理环境,会影响从视图获得的结果:\x0d\x0a  mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql> SET NAMES 'latin1';\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql> SELECT * FROM v;\x0d\x0a+-------------------+---------------------+\x0d\x0a| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |\x0d\x0a+-------------------+---------------------+\x0d\x0a| latin1 | latin1_swedish_ci |\x0d\x0a+-------------------+---------------------+\x0d\x0a1 row in set (0.00 sec)\x0d\x0a \x0d\x0amysql> SET NAMES 'utf8';\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql> SELECT * FROM v;\x0d\x0a+-------------------+---------------------+\x0d\x0a| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |\x0d\x0a+-------------------+---------------------+\x0d\x0a| utf8 | utf8_general_ci |\x0d\x0a+-------------------+---------------------+\x0d\x0a1 row in set (0.00 sec)\x0d\x0a\x0d\x0a  可选的ALGORITHM子句是对标准SQL的MySQL扩展。ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。\x0d\x0a  对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。\x0d\x0a  对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。\x0d\x0a  对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。\x0d\x0a  明确选择TEMPTABLE的1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。\x0d\x0a  视图算法可以是UNDEFINED,有三种方式:\x0d\x0a  · 在CREATE VIEW语句中没有ALGORITHM子句。\x0d\x0a  · CREATE VIEW语句有1个显式ALGORITHM = UNDEFINED子句。\x0d\x0a  · 为仅能用临时表处理的视图指定ALGORITHM = MERGE。在这种情况下,MySQL将生成告警,并将算法设置为UNDEFINED。\x0d\x0a  正如前面所介绍的那样,通过将视图定义中的对应部分合并到引用视图的语句中,对MERGE进行处理。在下面的示例中,简要介绍了MERGE的工作方式。在该示例中,假定有1个具有下述定义的视图v_merge:\x0d\x0a  CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS\x0d\x0aSELECT c1, c2 FROM t WHERE c3 > 100;\x0d\x0a\x0d\x0a  示例1:假定发出了下述语句:\x0d\x0a  SELECT * FROM v_merge;\x0d\x0a\x0d\x0a  MySQL以下述方式处理语句:\x0d\x0a  · v_merge成为t\x0d\x0a  · *成为vc1、vc2,与c1、c2对应\x0d\x0a  · 增加视图WHERE子句\x0d\x0a  所产生的将执行的语句为:\x0d\x0a  SELECT c1, c2 FROM t WHERE c3 > 100;\x0d\x0a\x0d\x0a  示例2:假定发出了下述语句:\x0d\x0a  SELECT * FROM v_merge WHERE vc1 < 100;\x0d\x0a\x0d\x0a  该语句的处理方式与前面介绍的类似,但vc1 < 100变为c1 < 100,并使用AND连接词将视图的WHERE子句添加到语句的WHERE子句中(增加了圆括号以确保以正确的优先顺序执行子句部分)。所得的将要执行的语句变为:\x0d\x0a  SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);\x0d\x0a\x0d\x0a  事实上,将要执行的语句是具有下述形式的WHERE子句:\x0d\x0a  WHERE (select WHERE) AND (view WHERE)\x0d\x0a\x0d\x0a  MERGE算法要求视图中的行和基表中的行具有一对一的关系。如果不具有该关系。必须使用临时表取而代之。如果视图包含下述结构中的任何一种,将失去一对一的关系:\x0d\x0a  · 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。\x0d\x0a  · DISTINCT\x0d\x0a  · GROUP BY\x0d\x0a  · HAVING\x0d\x0a  · UNION或UNION ALL\x0d\x0a  · 仅引用文字值(在该情况下,没有基本表)。\x0d\x0a  某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:\x0d\x0a  · 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。\x0d\x0a  · DISTINCT\x0d\x0a  · GROUP BY\x0d\x0a  · HAVING\x0d\x0a  · UNION或UNION ALL\x0d\x0a  · 位于选择列表中的子查询\x0d\x0a  · Join\x0d\x0a  · FROM子句中的不可更新视图\x0d\x0a  · WHERE子句中的子查询,引用FROM子句中的表。\x0d\x0a  · 仅引用文字值(在该情况下,没有要更新的基本表)。\x0d\x0a  · ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。\x0d\x0a  关于可插入性(可用INSERT语句更新),如果它也满足关于视图列的下述额外要求,可更新的视图也是可插入的:\x0d\x0a  · 不得有重复的视图列名称。\x0d\x0a  · 视图必须包含没有默认值的基表中的所有列。\x0d\x0a  · 视图列必须是简单的列引用而不是导出列。导出列不是简单的列引用,而是从表达式导出的。下面给出了一些导出列示例:\x0d\x0a  · 3.14159\x0d\x0a· col1 + 3\x0d\x0a· UPPER(col2)\x0d\x0a· col3 / col4\x0d\x0a· (subquery)\x0d\x0a\x0d\x0a  混合了简单列引用和导出列的视图是不可插入的,但是,如果仅更新非导出列,视图是可更新的。考虑下述视图:\x0d\x0a  CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;\x0d\x0a\x0d\x0a  该视图是不可插入的,这是因为col2是从表达式导出的。但是,如果更新时不更新col2,它是可更新的。这类更新是允许的:\x0d\x0a  UPDATE v SET col1 = 0;\x0d\x0a\x0d\x0a  下述更新是不允许的,原因在于,它试图更新导出列:\x0d\x0a  UPDATE v SET col2 = 0;\x0d\x0a\x0d\x0a  在某些情况下,能够更新多表视图,假定它能使用MERGE算法进行处理。为此,视图必须使用内部联合(而不是外部联合或UNION)。此外,仅能更新视图定义中的单个表,因此,SET子句必须仅命名视图中某一表的列。即使从理论上讲也是可更新的,不允许使用UNION ALL的视图,这是因为,在实施中将使用临时表来处理它们。\x0d\x0a  对于多表可更新视图,如果是将其插入单个表中,INSERT能够工作。不支持DELETE。\x0d\x0a  对于可更新视图,可给定WITH CHECK OPTION子句来防止插入或更新行,除非作用在行上的select_statement中的WHERE子句为“真”。\x0d\x0a  在关于可更新视图的WITH CHECK OPTION子句中,当视图是根据另一个视图定义的时,LOCAL和CASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,CASCADED会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADED。


探究MySQL查询慢的原因上亿数据背后瓶颈何在mysql上亿查询慢原因_百度...
MySQL的写入性能也是影响查询效率的一个重要因素。当大量数据写入时,如果写入操作影响查询操作,就会导致查询变慢。为了解决这个问题,可以考虑以下方法:1. 使用分手写,将相同类型的数据写入同一个库中。2. 将热数据迁移到SSD中,提高写入速度。例如以下是一种提高写入性能的方法:用户信息表 CREATE TABL...

解析MySQL不使用外键意义何在mysql不用外键啥意思
外键约束经常会应用在指向同一表中的行的操作中。这种情况下,外键可能会限制数据操作的灵活性,因为插入或删除一个行时必须满足特定的限制。这种限制可能会导致不必要的复杂性和开销。禁用外键约束可能会使数据更加灵活,因为您更容易执行需要的操作。3、维护更方便 在关系数据库中,数据完整性是需要保持的...

PostgreSQL 与 MySQL 相比,优势何在?
PostgreSQL 的 Foreign data wrappers 允许将多种外部数据源(如 MySQL、Oracle、CSV、Hadoop 等)无缝整合到其数据库中,扩展了数据处理的可能性。综上所述,PostgreSQL 提供了更广泛的SQL支持、更灵活的数据处理、卓越的并发控制和性能,以及一系列高级特性,使得它在与 MySQL 的竞争中脱颖而出。如果你...

软件测试工程师发展规划路线
MySQL 数据库测试应用 MySQL 环境搭建, 客户端 Navicat 的基本使用与数据操作, 学习并巩固基本的 SQL 语法, 增删改查缺一不可, 掌握各种条件的使用方法 MySQL 高级查询 查询升级, 掌握多表查询, 子查询, 查询分组, 统计函数的使用, 并对经典面试题进行学习与分析 MySQL 自定义函数 既然有内置函数, 当然也不缺...

MYSQL怎么改变一条记录的位置?
楼上的怎么这么多质疑?人家就有这种需求了,解决就行啊,这么多话。步骤:1、取出记录1,并暂存。2、删除记录1。3、取出记录3,将其数据存为记录1。(id=1,这是可行的,因为记录1删除后,其id 将不再存在)4、删除记录3,将步骤1中暂存的记录1存为记录3。完毕。

PostgreSQL与MySQL相比,优势何在?
PostgreSQL类似于Oracle的多进程框架,可以支持高并发的应用场景。 如果把OracleDBA转到PostgreSQL数据库上是比较容易的,毕竟PostgreSQL数据库与Oracle数据库很相似。 PostgreSQL几乎支持所有的SQL标准,支持类型相当丰富。PostgreSQL数据库的源代码要比MySQL数据库的源代码更容易读懂,如果团队的C语言能力比较强的话,就可以在Postg...

数据库管理系统有哪些
Foxpro、MS SQL Server、Informix、PostgreSQL这几种。数据库管理系统软件的种类有很多,常见的也很多,但是针对不同人群的不同需求,常用的数据库管理系统软件也那么三五种:ORACLE、MySQL、ACCESS、MS SQL Server这些是不同领域常用的数据库管理系统软件,下面我们来介绍一下这些软件各自的优势何在。

mysql int显示宽度,在不补0的情况下,有必要设置吗?
没有必要设置,int型无论设置成多少位,最后他使用的空间还是11位,如要设置可以设置无符号或有符号就可以了

【SQL】表中的空字符串与NULL中的区别何在
mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (''); 这两条语句均会将值插入phone(电话)列,但第1条语句插入的是NULL值,第2条语句插入的是空字符串。第1种情况的含义可被解释为“电话号码未知”,而第2种情况的含义可被解释为“...

数据仓库的含义,数据仓库和数据库的区别.?
目前,数据仓库一词尚没有一个统一的定义,著名的数据仓库专家 W.H.Inmon 在其著作《 Building the Data Warehouse 》一书中给予如下描述:数据仓库( Data Warehouse )是一个面向主题的( Subject Oriented )、集成的( Integrate )、相对稳定的( Non-Volatile )、反映历史变化( Time Variant )的数据集合,用于支持...

当雄县13694958662: mysql 创建视图 -
米炒源首: MySql创建视图 (1).第一类:create view v as select * from table; (2).第二类:create view v as select id,name,age from table; (3).第三类:create view v[vid,vname,vage] as select id,name,age from table; 如果涉及到数据量过大,业务逻辑需要跨...

当雄县13694958662: mysql创建视图 -
米炒源首: mysql创建视图1. 首先查询select select_priv,create_view_priv from mysql.user where user ='root';2. 创建视图create view depart_view as select * from depart;3. 查询试图结构:desc depart_view;4. 第二钟创建视图:create view depart_view2(id,...

当雄县13694958662: 如何在MySQL中利用数据库表创建视图 -
米炒源首: 创建视图的理想步骤: 一般来说,视图创建可以分为五步走: 第一步:先考虑select语句的编写.我们知道,视图其实就是一个select语句的集合,所以,我们建立视图的第一步,就是考虑这个select语句的如何编写.这个select语句编写的是否...

当雄县13694958662: 如何在MySQL中建立一个视图 -
米炒源首: 你可以直接打开数据库有创建视图!或者是SQL代码create view_name!

当雄县13694958662: mysql 建立视图 -
米炒源首: 视图2个用处,一个是方便查询,比如下面的例子: sql> create view 2 v_sale_report_sum 3 as 4 select 5 sale_item, 6 sum(sale_money) as sale_money 7 from 8 sale_report 9 group by 10 sale_item; view created. sql> select * from v_sale_report_...

当雄县13694958662: 如何创建MySQL5的视图 -
米炒源首: 创建视图的语法如下:create view 视图名称 as 查询

当雄县13694958662: MySQL 如何创建视图?求高手. -
米炒源首: create view viewname as select score.sid,sname,cname,score from score left join student1 on score.sid=student1.sid left join course on score.cid=course.cid

当雄县13694958662: mysql多表查询并创建视图 -
米炒源首: MySQL在多个数据表上创建视图 在MySQL中,使用CREATE VIEW语句也可以在两个或两个以上的数据表上创建视图.实例 在department表和worker表上创建一个名为worker_view1的视图.1. 创建视图的代码如下:CREATE ALGORITHM=...

当雄县13694958662: mysql 数据库怎么创建视图 -
米炒源首: 视图的创建:CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] 其中:OR REPLACE :若所创建的试图已经存在,ORACLE...

当雄县13694958662: mysql中有视图吗?创建的语法是怎样的? -
米炒源首: 有.基本语法:CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]VIEW view_name [(column_list)]AS select_statement[WITH [CASCADED | LOCAL] CHECK OPTION]示例: mysql> CREATE TABLE t (qty ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网