目录
一、引言
二、什么是视图
三、创建视图
四、使用视图
五、修改数据
六、删除视图
七、视图的优点
八、总结
一、引言
这一期咱们换个话题,来讲讲MySQL里的视图。和上一期讲的索引、事务一样,视图也是日常开发中可能会用到的基础知识点,不算复杂,但新手容易和表搞混。还是老规矩,不深讲底层原理,只给大家讲清楚“什么是视图、怎么用视图”,保证看完就能上手,咱们废话不多说,进入正题
二、什么是视图
其实视图特别好理解,咱们还是用大白话来讲,不用记专业定义。视图本质上不是一张真实的表,没有自己的物理数据,它更像是一个“虚拟的表”,或者说是一个“查询语句的别名”。
简单说,视图就是把一个复杂的查询语句,保存起来,起个名字,以后再想执行这个查询,不用再写一长串SQL,直接调用这个视图的名字就行。它展示的数据,都是来自于背后的真实数据表,视图本身不存储任何数据,相当于一个“窗口”,我们通过这个窗口,能看到真实表中我们需要的数据。
举个例子:我们有一张user表,里面有id、name、age、phone、address等很多字段,而我们日常查询,只需要name、age、phone这三个字段,每次都写SELECT name,age,phone FROM user;很麻烦,这时候就可以创建一个视图,把这个查询语句保存起来,以后直接查视图,就能得到这三个字段的数据,不用再重复写查询语句。
三、创建视图
创建视图的语法很简单,核心就是“CREATE VIEW 视图名 AS 查询语句”,咱们结合实际例子来讲,新手直接照搬就能用,不用死记语法。
首先,创建视图的基本语法:
CREATE VIEW 视图名 AS SELECT 字段1, 字段2... FROM 表名 [WHERE 条件];
这里有几个小细节,跟大家说一下:视图名建议起得有意义,比如v_user_info(v_开头表示视图,后面跟用途),方便后续区分;查询语句可以是简单的单表查询,也可以是多表关联查询,只要是合法的SELECT语句都可以。
举两个实际例子,大家一看就懂:
1. 单表创建视图:从user表中,只提取name、age、phone三个字段,创建视图v_user_basic:
CREATE VIEW v_user_basic AS SELECT name, age, phone FROM user;
2. 带条件的视图:从user表中,提取age>18的用户,只显示name和phone,创建视图v_user_adult:
CREATE VIEW v_user_adult AS SELECT name, phone FROM user WHERE age > 18;
注意:创建视图的时候,要保证你有创建视图的权限,另外,视图的字段名可以和原表一致,也可以自己重命名,比如SELECT name AS 姓名, age AS 年龄 FROM user,这样视图里的字段名就是“姓名”“年龄”,更直观。
四、使用视图
使用视图比创建视图更简单,因为视图本质上就是一个“虚拟表”,所以使用它的方式,和使用普通的表几乎一样,最常用的就是查询操作。
1. 基本查询:直接查询视图,和查普通表一样,语法:SELECT * FROM 视图名;
比如查询我们刚才创建的v_user_basic视图,直接写:
SELECT * FROM v_user_basic;
执行后,就会显示视图中保存的name、age、phone三个字段的数据,和执行原来的查询语句结果完全一样,但更简洁。
2. 带条件查询:也可以给视图加WHERE条件,筛选需要的数据,比如查询v_user_basic中age=20的用户:
SELECT * FROM v_user_basic WHERE age = 20;
3. 结合排序、分页:和普通表一样,视图也能使用ORDER BY、LIMIT等关键字,比如查询v_user_adult,按name排序,只显示前10条:
SELECT * FROM v_user_adult ORDER BY name LIMIT 10;
这里提醒一句:视图只能用来查询(大部分场景),不能直接用来插入、修改、删除数据(后面会讲特殊情况),核心作用就是简化查询。
五、修改数据
这里要重点说一下:不是所有视图都能修改数据,只有满足一定条件的视图,才能通过视图修改背后真实表的数据,而且修改视图的数据,本质上是修改视图背后真实表的数据,视图本身不会存储数据。
先说说能修改数据的视图要满足的条件(新手记重点就行):
1. 视图是基于单表创建的,没有使用DISTINCT、GROUP BY、HAVING等关键字;
2. 视图的字段,必须对应真实表的字段,不能是计算字段(比如SUM(age)、name||'_'||phone这种)。
满足条件后,修改数据的语法和普通表一样,常用的有UPDATE、INSERT、DELETE三种:
1. 通过视图修改数据(UPDATE):比如修改v_user_basic中name='张三'的用户年龄为22:
UPDATE v_user_basic SET age = 22 WHERE name = '张三';
执行后,真实的user表中,张三的age也会变成22,视图只是一个“窗口”,修改的还是底层数据。
2. 通过视图插入数据(INSERT):比如给v_user_basic插入一条新数据(注意字段要和视图一致):
INSERT INTO v_user_basic (name, age, phone) VALUES ('李四', 25, '13900139000');
3. 通过视图删除数据(DELETE):比如删除v_user_basic中name='李四'的数据:
DELETE FROM v_user_basic WHERE name = '李四';
重点提醒:如果视图是多表关联创建的,或者用了DISTINCT、GROUP BY等关键字,就不能修改数据了,执行UPDATE、INSERT、DELETE会报错,新手一定要注意这一点。
六、删除视图
删除视图很简单,语法比删除索引还简单,而且删除视图不会影响背后的真实表和数据,只是删除了保存的查询语句,不用担心误删数据。
删除视图的基本语法:DROP VIEW 视图名;
举个例子:删除我们刚才创建的v_user_adult视图:
DROP VIEW v_user_adult;
如果想一次性删除多个视图,也可以用逗号分隔:
DROP VIEW v_user_basic, v_user_adult;
注意:删除视图前,确认好视图名,别删错了;另外,删除视图不需要删除底层表,只删视图本身即可,删完之后,就不能再通过这个视图查询数据了,但底层表的数据依然存在。
七、视图的优点
讲完了怎么用,再跟大家说说视图的优点,为什么我们要用到视图?其实核心就是“简化操作、保证安全”,用大白话总结4个最实用的优点,新手一看就懂:
1. 简化查询,提高效率:把复杂的查询语句(比如多表关联、多条件筛选)保存成视图,后续查询不用重复写长SQL,直接调用视图名,节省时间,也减少写错的概率。
2. 隐藏敏感数据,保证数据安全:比如user表中有address、身份证号等敏感字段,我们可以创建视图,只展示name、age等非敏感字段,给其他开发者或用户只开放视图的查询权限,不让他们看到敏感数据,保护数据安全。
3. 统一查询逻辑,减少冗余:如果多个地方都需要用到同一个查询逻辑,不用每个地方都写一遍SQL,只需要创建一个视图,所有地方都调用这个视图,后续如果查询逻辑需要修改,只改视图的查询语句,不用改所有地方,减少冗余,也方便维护。
4. 降低新手门槛:对于刚接触MySQL的新手来说,复杂的多表关联查询很难写,而视图已经封装好了查询逻辑,新手直接查询视图,就能得到需要的数据,不用理解背后复杂的查询语句。
当然,视图也有小缺点,比如不能直接修改复杂视图的数据,查询视图本质上还是执行背后的查询语句,性能和直接写SQL差不多,但日常开发中,优点完全大于缺点,还是很实用的。
八、总结
好了,这一期MySQL视图的基础内容,就全部讲完啦。还是延续咱们的风格,不搞复杂原理,只讲日常能用得上的知识点,新手看完就能上手操作,咱们简单回顾一下核心重点,方便大家记忆:
1. 视图是“虚拟表”,不存储真实数据,本质是保存的查询语句,数据都来自于底层的真实表;
2. 核心操作:创建(CREATE VIEW)、查询(和查普通表一样)、修改(有限制)、删除(DROP VIEW),语法都很简单,重点记创建和查询的用法;
3. 视图的核心优点:简化查询、隐藏敏感数据、统一逻辑、降低新手门槛,适合日常开发中需要重复使用同一查询逻辑的场景;
4. 小提醒:不是所有视图都能修改数据,多表关联、带DISTINCT/GROUP BY的视图,无法修改数据;删除视图不影响底层表数据。
视图和上一期讲的索引、事务,都是MySQL基础且常用的知识点,不用死记硬背,多动手实操一遍,就能熟练掌握。这一期就先讲到这里,后续再跟大家分享更多MySQL基础知识点。