MySQL 8.0——视图
视图1、视图概述1.1、视图的含义1.2、视图的作用2、创建视图2.1、创建视图的语法形式2.2、在单表上创建视图2.3、在多表上创建视图3、查看视图3.1、使用DESCRIBE语句查看视图基本信息3.2、使用SHOW TABLE STATUS语句查看视图基本信息3.3、使用SHOW CREATE VIEW语句查看视图详细信息3.4、在views表中查看视图详细信息4、修改视图4.1、使用CREATE OR REPLACE VIEW语句修改视图4.2、使用ALTER语句修改视图5、更新视图6、删除视图7、常见问题7.1、两者的区别7.2、两者的联系数据库中的视图是一个虚拟表。同真实的表一样视图包含一系列带有名称的行和列数据。行和列数据来自由定义视图查询所引用的表并且在引用视图时动态生成。1、视图概述视图是从一个或者多个表中导出的视图的行为与表非常相似但视图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据以及使用INSERT、UPDATE和DELETE修改记录。从MySQL 5.0开始可以使用视图视图可以使用户操作方便而且可以保障数据库系统的安全。1.1、视图的含义视图是一个虚拟表是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基础上定义。视图一经定义便存储在数据库中与其相对应的数据并没有像表那样在数据库中再存储一份通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时相应的基本表的数据也要发生变化同时若基本表的数据发生变化则这种变化也可以自动反映到视图中。下面有一个student表和stu_info表在student表中包含了学生的id号和姓名stu_info表中包含了学生的id号、班级和家庭住址而现在公布分班信息只需要id号、姓名和班级该如何解决呢表设计如下createtablestudent(s_idint,namevarchar(40));createtablestu_info(s_idint,glassvarchar(40),addrvarchar(90));通过DESC命令可以查看表的设计可以获得字段、字段的定义、是否为主键、是否为空、默认值和扩展信息。视图提供了一个很好的解决方法。创建一个视图这些信息来自表的部分信息其他的信息不取这样既能满足要求也不破坏表原来的结构。1.2、视图的作用与直接从数据表中读取相比视图有以下优点简单化看到的就是需要的。视图不仅可以简化用户对数据的理解也可以简化它们的操作。那些被经常使用的查询可以被定义为视图从而使得用户不必为以后的操作每次指定全部的条件。安全性通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上但不能授权到数据库特定行和特定的列上。通过视图用户可以被限制在数据的不同子集上使用权限可被限制在基表的行的子集上。使用权限可被限制在基表的列的子集上。使用权限可被限制在基表的行和列的子集上。使用权限可被限制在多个基表的连接所限定的行上。使用权限可被限制在基表中的数据的统计汇总上。使用权限可被限制在另一视图的一个子集上或是一些视图和基表合并后的子集上。逻辑数据独立性视图可帮助用户屏蔽真实表结构变化带来的影响。2、创建视图视图中包含了SELECT查询的结果因此视图的创建基于SELECT语句和已存在的数据表。视图可以建立在一张表上也可以建立在多张表上2.1、创建视图的语法形式创建视图使用CREATE VIEW语句基本语法格式如下CREATE[ORREPLACE][ALGORITHM{UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name {(column_list)]asselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]CREATE表示创建新的视图REPLACE表示替换已经创建的视图ALGORITHM表示视图选择的算法UNDEFINED表示MySQL将自动选择算法MERGE表示将使用的视图语句与视图定义合并起来使得视图定义的某一部分取代 语句对应的部分TEMPTABLE表示将视图的结果存入临时表然后用临时表来执行语句。view_name为视图的名称column_list为属性列SELECT_statement表示SELECT语句WITH [CASCADED | LOCAL] CHECKOPTION参数表示视图在更新时保证在视图的权限范围之内。CASCADED与LOCAL为可选参数。CASCADED为默认值表示更新视图时要满足所有相关视图和表的条件LOCAL表示更新视图时满足该视图本身定义的条件即可。该语句要求具有针对视图的CREATE VIEW权限以及针对由SELECT语句选择的每一列上的某些权限。对于在SELECT语句中其他地方使用的列必须具有SELECT权限。如果还有OR REPLACE子句必须在视图上具有DROP权限。视图属于数据库。在默认情况下将在当前数据库创建新视图。要想在给定数据库中明确创建视图创建时应将名称指定为db_name.view_name。2.2、在单表上创建视图MySQL可以在单个数据表上创建视图。在t表上创建一个名为view_t的视图代码如下首先创建基本表并插入数据语句如下createtablet(quantityint,priceint);insertintotvalues(3,50);创建视图语句为createviewview_tasselectquantity,price,quantity*pricefromt;查询视图执行如下select*fromview_t;-----------------------------------|quantity|price|quantity*price|-----------------------------------|3|50|150|-----------------------------------默认情况下创建的视图和基本表的字段是一样的也可以通过指定视图字段的名称来创建视图。在t表格上创建一个名为view_t2的视图代码如下createviewview_t2(qty,price,total)asselectquantity,price,quantity*pricefromt;语句执行成功后查看view_t2视图中的数据select*fromview_t2;-------------------|qty|price|total|-------------------|3|50|150|-------------------可以看到view_t2和view_t两个视图中的字段名称不同但数据却是相同的。因此在使用视图的时候可能用户根本就不需要了解基本表的结构更接触不到实际表中的数据从而保证了数据库的安全。2.3、在多表上创建视图MySQL中也可以在两个或者两个以上的表上创建视图可以使用CREATE VIEW语句实现。在表student和表stu_info上创建视图stu_glass代码如下首先向两个表中插入数据输入语句如下insertintostudentvalues(1,wanglin1),(2,gaoli),(3,zhanghai);insertintostu_infovalues(1,wuban,henan),(2,liuban,hebei),(3,aiban,shangdong);创建视图stu_glass语句如下createviewstu_glass(id,name,glass)asselectstudent.s_id,student.name,stu_info.glassfromstudent,stu_infowherestudent.s_idstu_info.s_id;select*fromstu_glass;----------------------|id|name|glass|----------------------|1|wanglin1|wuban||2|gaoli|liuban||3|zhanghai|aiban|----------------------这个例子就解决了刚开始提出的那个问题通过这个视图可以很好地保护基本表中的数据。这个视图中的信息很简单只包含了id、姓名和班级id字段对应student表中的s_id字段name字段对应student表中的name字段glass字段对应stu_info表中的glass字段。3、查看视图查看视图是查看数据库中已存在的视图的定义。查看视图必须要有SHOW VIEW的权限MySQL数据库下的user表中保存着这个信息。查看视图的方法包括DESCRIBESHOW TABLE STATUSSHOW CREATEVIEW3.1、使用DESCRIBE语句查看视图基本信息DESCRIBE可以用来查看视图具体的语法如下DESCRIBE视图名;通过DESCRIBE语句查看视图view_t的定义代码如下describeview_t;-----------------------------------------------------|Field|Type|Null|Key|Default|Extra|-----------------------------------------------------|quantity|int|YES||null|||price|int|YES||null|||quantity*price|bigint|YES||null||-----------------------------------------------------结果显示出了视图的字段定义、字段的数据类型、是否为空、是否为主/外键、默认值和额外信息。DESCRIBE一般情况下都简写成DESC输入这个命令的执行结果和输入DESCRIBE的执行结果是一样的。3.2、使用SHOW TABLE STATUS语句查看视图基本信息查看视图的信息可以通过SHOW TABLESTATUS的方法完成具体的语法如下SHOWTABLESTATUSLIKE视图名;使用SHOW TABLE STATUS命令查看视图信息代码如下showtablestatuslikeview_t\G;***************************[1.row]***************************Name|view_tEngine|nullVersion|nullRow_format|nullRows|nullAvg_row_length|nullData_length|nullMax_data_length|nullIndex_length|nullData_free|nullAuto_increment|nullCreate_time|2026-06-2520:29:37Update_time|nullCheck_time|nullCollation|nullChecksum|nullCreate_options|nullComment|VIEW执行结果显示表的说明Comment的值为VIEW说明该表为视图其他的信息为NULL说明这是一个虚表。用同样的语句来查看一下数据表t的信息执行结果如下showtablestatusliket\G;***************************[1.row]***************************Name|tEngine|InnoDBVersion|10Row_format|DynamicRows|1Avg_row_length|16384Data_length|16384Max_data_length|0Index_length|0Data_free|55574528Auto_increment|nullCreate_time|2026-06-2520:28:22Update_time|2026-06-2520:28:22Check_time|nullCollation|utf8mb3_general_ci Checksum|nullCreate_options|Comment|从查询的结果来看这里的信息包含了存储引擎、创建时间等Comment信息为空这就是视图和表的区别。3.3、使用SHOW CREATE VIEW语句查看视图详细信息使用SHOW CREATE VIEW语句可以查看视图详细定义语法如下SHOWCREATEVIEW视图名;使用SHOW CREATE VIEW查看视图的详细定义代码如下showcreateviewview_t \G;***************************[1.row]***************************View|view_tCreateView|CREATEALGORITHMUNDEFINEDDEFINERroot%SQLSECURITYDEFINERVIEWview_tASselectt.quantityASquantity,t.priceASprice,(t.quantity*t.price)ASquantity * pricefromtcharacter_set_client|utf8mb4 collation_connection|utf8mb4_0900_ai_ci执行结果显示视图的名称、创建视图的语句等信息。3.4、在views表中查看视图详细信息在MySQL中information_schema数据库下的views表中存储了所有视图的定义。通过对views表的查询可以查看数据库中所有视图的详细信息查询语句如下select*frominformation_schema.views \G;4、修改视图修改视图是指修改数据库中存在的视图当基本表的某些字段发生变化的时候可以通过修改视图来保持与基本表的一致性。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。4.1、使用CREATE OR REPLACE VIEW语句修改视图在MySQL中修改视图可使用CREATE ORREPLACE VIEW语句语法如下CREATE[ORREPLACE][ALGORITHM{UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name[(column_list)]asselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]可以看到修改视图的语句和创建视图的语句是完全一样的。当视图已经存在时修改语句对视图进行修改当视图不存在时创建视图。下面通过一个实例来说明。修改视图view_t代码如下createorreplaceviewview_tasselect*fromt;首先通过DESC查看一下更改之前的视图以便与更改之后的视图进行对比。执行的结果如下descview_t;-------------------------------------------|Field|Type|Null|Key|Default|Extra|-------------------------------------------|quantity|int|YES||null|||price|int|YES||null||-------------------------------------------从执行的结果来看相比原来的视图view_t新的视图view_t少了1个字段。4.2、使用ALTER语句修改视图ALTER语句是MySQL提供的另外一种修改视图的方法语法如下ALTER[ALGORITHM{UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name[(column_list)]asselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]这个语法中的关键字和前面视图的关键字是一样的这里就不再介绍了。使用ALTER语句修改视图view_t代码如下alterviewview_tasselectquantityfromt;执行结果如下descview_t;-------------------------------------------|Field|Type|Null|Key|Default|Extra|-------------------------------------------|quantity|int|YES||null||-------------------------------------------通过ALTER语句同样可以达到修改视图view_t的目的从上面的执行过程来看视图view_t只剩下一个quantity字段修改成功。5、更新视图更新视图是指通过视图来插入、更新、删除表中的数据因为视图是一个虚拟表其中没有数据。通过视图更新的时候都是转到基本表上进行更新的如果对视图增加或者删除记录实际上是对其基本表增加或者删除记录。视图更新的3种方法INSERTUPDATEDELETE使用UPDATE语句更新视图view_t代码如下updateview_tsetquantity5;查看视图更新之后基本表的内容如下select*fromt;-----------------|quantity|price|-----------------|5|50|-----------------select*fromview_t;----------|quantity|----------|5|----------select*fromview_t2;-------------------|qty|price|total|-------------------|5|50|250|-------------------对视图view_t更新后基本表t的内容也更新了同样当对基本表t更新后另外一个视图view_t2中的内容也会更新。使用INSERT语句在基本表t中插入一条记录代码如下insertintotvalues(3,5);执行结果如下select*fromt;-----------------|quantity|price|-----------------|5|50||3|5|-----------------select*fromview_t2;-------------------|qty|price|total|-------------------|5|50|250||3|5|15|-------------------向表t中插入一条记录通过SELECT查看表t和视图view_t2可以看到其中的内容也跟着更新视图更新的不仅仅是数量和单价总价也会更新。使用DELETE语句删除视图view_t2中的一条记录代码如下deletefromview_t2whereprice5;执行结果如下select*fromt;-----------------|quantity|price|-----------------|5|50|-----------------select*fromview_t2;-------------------|qty|price|total|-------------------|5|50|250|-------------------在视图view_t2中删除price5的记录视图中的删除操作最终是通过删除基本表中相关的记录实现的查看删除操作之后的表t和视图view_t2可以看到通过视图删除其所依赖的基本表中的数据。当视图中包含有如下内容时视图的更新操作将不能被执行视图中不包含基表中被定义为非空的列。在定义视图的SELECT语句后的字段列表中使用了数学表达式。在定义视图的SELECT语句后的字段列表中使用聚合函数。在定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY或HAVING子句。6、删除视图当视图不再需要时可以将其删除。删除一个或多个视图可以使用DROP VIEW语句语法如下DROPVIEW[IFEXISTS]view_name[,view_name]...[RESTRICT|CASADE]view_name是要删除的视图名称可以添加多个需要删除的视图名称各个名称之间使用逗号分隔开。删除视图必须拥有DROP权限。删除stu_glass视图代码如下dropviewifexistsstu_glass;如果名称为stu_glass的视图存在那么该视图将被删除。使用SHOW CREATE VIEW语句查看操作结果showcreateviewstu_glass;(1146,Table test_db.stu_glass doesnt exist)可以看到stu_glass视图已经不存在删除成功。7、常见问题7.1、两者的区别视图是已经编译好的SQL语句是基于SQL语句结果集的可视化表而表不是。视图没有实际的物理记录而表有。表是内容视图是窗口。表占用物理空间而视图不占用物理空间。视图只是逻辑概念的存在表可以及时修改但视图只能用创建的语句来修改。视图是查看数据表的一种方法可以查询数据表中某些字段构成的数据只是一些SQL语句的集合。从安全的角度来说视图可以防止用户接触数据表因而用户不知道表结构。表属于全局模式中的表是实表视图属于局部模式的表是虚表。视图的建立和删除只影响视图本身不影响对应的基本表。7.2、两者的联系视图view是在基本表之上建立的表它的结构所定义的列和内容所有记录都来自基本表它依据基本表存在而存在。一个视图可以对应一个基本表也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。