mysql数据库,如何创建删除修改查询一个视图view?
发布于 作者:苏南大叔 来源:程序如此灵动~说说mysql
中最简单基础的部分:视图view
。视图在mysql
的相关应用中,是比较常见的。使用的时候和普通的数据表是非常类似的,唯一有较大区别的地方是:视图有一定的概率是只读的,不能像数据表一样修改数据和删除数据。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。本文测试环境:win10
,mysql@5.7.26
。在本文中,你将了解到mysql
视图的使用方式。
基础数据表
视图是以普通的表为基础的,所以视图的前提是有普通的数据表。本文的测试数据表如下:
CREATE TABLE `pets` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `pets` VALUES (1,'小黑',1),(2,'虎子',2),(3,'二赖子',2),(4,'老白',3),(5,'老许',3),(6,'小白',3);
CREATE TABLE `pets_category` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `pets_category` VALUES (1,'大猫'),(2,'大狗'),(3,'小猫');
创建视图
确定已经有了基础的数据表之后,就可以把对基础表的select
语句转化为视图了。
CREATE VIEW [视图名称] AS [SELECT语句];
可以建立一个仅仅涉及单表的视图:
CREATE VIEW view_pets as select id,name FROM pets;
这是一个最经典的带分类表的联合查询
CREATE VIEW view_pets2 as select a.id,a.name,a.cid,b.name as cname FROM pets as a left join pets_category as b using(cid);
这个视图还可以自定义字段名称,例如:
CREATE VIEW view_pets3(pet_id,pet_name,pet_category_id,pet_category_name) as select a.id,a.name,a.cid,b.name as cname FROM pets as a left join pets_category as b using(cid);
删除视图
当然,最简单的方法是在mysql
的各种可视化工具里面删除,比如:本文中苏南大叔使用的MYSQL-Front
可视化工具。但是,为了体现极客范儿以及更广泛的适用性,苏南大叔使用sql
命令来删除视图。
DROP VIEW IF EXISTS [视图名称]
删除视图,虽然需要细心确认。但是,视图里面实际并没有存储数据,所以误删除了也不要特别担心。只要有建表语句就还可以瞬间恢复回来(包括所有的数据)。
修改视图
ALTER VIEW [视图名称] AS [SELECT语句]
ALTER VIEW view_pets as select id as pet_id,name FROM pets;
就是简单的把创建视图的create
换成了alter
。
对视图数据的增删改查
对于视图来说,把其属性想象成普通的表即可。理论上来说,经典的select
/update
/insert
/delete
语句,都是可以执行的。
但是,由于视图里面的数据只是其它表的一部分,或者多部分。所以,为了防止出现逻辑上的意外,只有数据来自同一个表的视图默认是可写的。
视图本身可能是只读的,
- 如果视图是以某一个视图为基础创建的,那么,这个视图大概率是可写的。
- 如果视图使用了聚合函数的话,那么,这个视图就必然是不可写的。
- 如果视图使用了多个表联合查询的话,那么,这个视图也是不可写的【最常见】。
最终的建议是:
可以主动或者被动的选择:只对视图执行select
语句,不执行update
/insert
/delete
语句,这是个非常好的选择。
关于视图只读的话题,后续会有新的文章进行描述。
参考文章
- https://newsn.net/say/mysql-left-join.html
- https://newsn.net/say/mysql-inner-join.html
- https://newsn.net/say/mysql-using.html
- https://newsn.net/say/mysql-having.html
结束语
更多mysql
的经验文章,可以参考苏南大叔的文章链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。