MySQL视图
关联查询的SQL语句(已虚拟化为无意义的表名和字段名)
select a.f1,a.f2,a.f3, b.t1,b.t2,b.t3, c.y1,c.y2, d.z1 from A as a left join B as b on a.f1 = b.t1 and b.t2=1 and b.t3=1 left join C as c on a.f1 = c.y1 and c.y2!=3 left join D as d on a.f1 = d.z1 where a.f3=2 order by a.f2 desc limit 0,100;
改为创建视图:
create view e_view as select a.f1,a.f2,a.f3, b.t1,b.t2,b.t3, c.y1,c.y2, d.z1 from A as a left join B as b on a.f1 = b.t1 and b.t2=1 and b.t3=1 left join C as c on a.f1 = c.y1 and c.y2!=3 left join D as d on a.f1 = d.z1 where a.f3=2
简化后的查询方法:
select e_view where xxx order by a.f2 desc limit 0,100;
https://www.cnblogs.com/aixinyiji/p/11017557.html
1,什么是视图
视图(view)是一种虚拟的表,并不在数据库中实际存在。通俗的来说,视图就是执行select语句后返回的结果。
2,为什么要使用视图
1,简单
对于数据库的用户来说,很多时候,需要的关键信息是来自多张复杂关联表的。这时用户就不得不使用十分复杂的SQL语句进行查询,给用户造成极差的体验感。使用视图之后,可以极大的简化操作,使用视图的用户不需要关心相应表的结构、关联条件等。对于用户来说,视图就是他们想要查询的结果集。
2,安全
使用视图的用户只能访问被允许查询的结果,使用视图可以限制用户访问一些敏感信息列。
3,使用视图的小案例
1,在案例中学习代码永远都是最快的
创建如下三个表格:
#users表的创建 CREATE TABLE `users` ( `u_id` int(4) NOT NULL auto_increment, `username` varchar(20) default NULL, `age` int(4) default NULL, `country` varchar(20) default NULL, PRIMARY KEY (`u_id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; #course表的创建 CREATE TABLE `course` ( `c_id` int(4) NOT NULL auto_increment, `coursename` varchar(20) default NULL, `description` varchar(255) default NULL, PRIMARY KEY (`c_id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; #user_course表的创建 CREATE TABLE `user_course` ( `u_c_id` int(4) NOT NULL auto_increment, `userid` int(4) NOT NULL, `courseid` int(4) NOT NULL, PRIMARY KEY (`u_c_id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
向表中插入如下数据:
接下来我们的任务是:查询tom所修的课程,显示tom的名字和课程名
#方法一:子查询的方式 select username,coursename from users u,course c where u.username = 'tom' and c.c_id in ( select courseid from user_course where userid = ( select u_id from users where username = 'tom')) #方法二:外链接的方式 select username,coursename from user_course left join course on user_course.courseid = course.c_id left join users on user_course.userid = users.u_id where username = 'tom'
可以看出,并不是很复杂的关联表的查询已经如此的复杂
如果我们使用视图
#使用视图进行查询 select username,coursename from user_course_view where username = 'tom'
这就是最简单的查询语句
2,见识了视图的便捷,再来看看视图是如何使用的。
1,视图的创建
#创建视图 create view user_course_view as select * from user_course left join course on user_course.courseid = course.c_id left join users on user_course.userid = users.u_id
结果如下:
如上图所示,我们已经将三张表格放在了一张视图里面
对于想要查询的内容,我们可以在这个视图中进行,极大的简化了操作。
#创建视图,隐藏课程的描述信息 create view user_course_view as select user_course.*,users.*,course.c_id,course.coursename from user_course left join course on user_course.courseid = course.c_id left join users on user_course.userid = users.u_id
假设课程的描述信息是隐秘信息,不希望用户查询的话,可以使用以上代码进行隐藏,效果如下:
与之前相比,课程的描述信息已经隐藏了,这就是视图的另一个优点。
2,视图的相关操作
上面我们已经讲了视图的查询操作,那么除了查询还可以进行哪些操作呢?
视图与表是一对一的关系:此时视图和表的操作是一样的。
视图与表是一对多的关系:上面的小案例中,视图与表是一对三的关系
只可以对视图进行改的操作,而且是在没有其他约束的情况下
insert into user_course_view(userid,courseid,coursename) value(3,2,'java');#错误的
update user_course_view set coursename = 'java web' where u_c_id = 1;#正确
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2019-01-10 PHP消息队列实现及应用_慕课网学习
2018-01-10 nginx上支持.htaccess伪静态的配置实例