sql 视图的用法
在一个项目的实际开发过程中牵涉到复杂业务的时候,我们不可避免的需要使用中间表来进行数据连接,有的同学就说了,我可以采用Hibernate进行主外键进行关联啊?多对多,多对一,一对一,等,采用主外键关联在数据的操作过程中具有很强的耦合性,尤其对于需要经常删改数据表而言,我们是不建议采用主外键关联这种模式,那么,如果我们采用中间表的话,当数据过大在性能上又面临严峻考验,sql视图的出现,在解决中间表的业务逻辑上是不错的选择。ok,首先我们了解什么是视图?
1、视图是表?没错,但是是一张虚拟表,视图的字段是由我们自定义的,视图只供查询,数据不可更改,查询数据来源于我们建立的实体表。
2、使用视图的优势?视图可以将多个复杂关联表,提取出我们需要的信息,优化查询速度。
如何创建视图?
我们先建立三张表;如下:



这个是典型的一对多和一对一的关系,那么,假如每张表的数据都在一万条数据以上,现在查询在潢高上学的学生姓名?
首先,我们分析一下,在潢高上学?首先是一个高中,那么我们会有一条Sql where school='潢高',
查询出一个List,得到gradeids,然后再到grade中根据gradeids查询这么多grades对应的studentids,在使用这些studentsid查询出students循环最后得到name?
是不是很累赘?查询是不是很影响性能?
观察得知,这三张表每两张表之间都是通过id进行关联的,如果我们通过id将三张表组成一张表,是不是很方便?
我们来关联学校表和年级表:这个年级ID我们不要,ok?
|
1
|
select s.id as schoolId,s.school as schoolName,s.gradeid as gradeid,g.grade as gradeName,g.studentid as studentid from school s,grade g where s.gradeid=g.id; |

那么我们再关联上学生表,学生表的id等于年级表的studentid ok?
|
1
2
|
SELECT s.id as schoolId,s.school as schoolName,s.gradeid as gradeid,g.grade as gradeName,g.studentid as studentid ,t.`name` as studentName,t.age as studentAgefrom school s,grade g,student t where s.gradeid=g.id and g.studentid=t.id; |
ok,到了这里?我们再看运行结果?

那么我们想查询在潢高上学的学生姓名,where schoolName='潢高',获取的list循环得到Object,通过Object.getStudentName,就可以了?
所以需要将查询到的结果,建立为一张虚拟表,这样才能操作,通过这个create view 视图名 as 命令建立:
意思就是将查询结果创建为名称为table_sgt的一张虚拟表:
|
1
|
create view table_sgt as(select s.id as schoolId,s.school as schoolName,s.gradeid as gradeid,g.grade as gradeName,g.studentid as studentid ,t.`name` as studentName,t.age as studentAge from school s,grade g,student t where s.gradeid=g.id and g.studentid=t.id); |


我们在使用视图的时候,需要把它看做为一张表,建立一张实体表需要做的步骤,视图也都需要(例如,实例化,配置映射文件,对象的属性get,set方法)
注意视图所查询出来的数据只能进行查看,不能增删改!
sql 视图的用法的更多相关文章
- 标准SQL语言的用法
原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...
- sql ————视图
视图与表的区别: 区别:1.视图是已经编译好的sql语句.而表不是 2.视图没有实际的物理记录.而表有. 3.表是内容,视图是窗口 4.表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可 ...
- SQL Server T—SQL 视图 事务
一 视图 视图是存储在数据库中的查询的SQL 语句, 视图是从一个或多个表或视图中导出的表,是一张虚表,只能对视图进行查询,不能增.删.改. 对视图进行修改要在相应的基本表中进行修改,修改会自动的反应 ...
- mysql关于视图的用法以及作用
关于视图的用法以及作用. 作用一: 提高了重用性,就像一个函数.如果要频繁获取user的name和goods的name.就应该使用以下sql语言.示例: select a.name as userna ...
- SQL语句---nvl 用法
SQL语句---nvl 用法 一NVL函数是一个空值转换函数 NVL(表达式1,表达式2) 如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值. 该函数的目的是把一个空值(nul ...
- SQL 语句日期用法及函数
SQL 语句日期用法及函数 --DAY().MONTH().YEAR()——返回指定日期的天数.月数.年数:select day(cl_s_time) as '日' from class --返回天 ...
- SQL —— 视图
1. 为什么使用视图 1) 提高数据的安全型,不同权限的用户可以查看数据的不同. 2) 符合用户日常业务逻辑 2. 什么是视图 视图是一种查看数据库中一个或多个表中的数据的方法. 视图是一种虚拟表. ...
- SQL 中ROLLUP 用法
SQL 中ROLLUP 用法 ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集. 下面是 CUBE 和 ROLLUP 之间的具体区别: CUBE 生成的结果集显示了所选列中值的所有 ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...
随机推荐
- libcurl在mac上编译
wget http://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.t ...
- OGG-01332 ogg高版本向低版本传输
Neo君遇到的ogg版本问题,在ggserr.log中的错误信息如下: 2018-10-12 09:55:10 ERROR OGG-01332 Oracle GoldenGate Delivery, ...
- 淘宝npm镜像安装失败的问题
一:背景 心血来潮要简单搞一搞前端运行.打包的东西.结果第一步通过npm安装淘宝npm的时候就出问题了,如图: 二:解决方法 图片显示有点垃圾,但是看出来“Missing write access t ...
- 关于Mysql中GROUP_CONCAT函数返回值长度的坑
1.GROUP_CONCAT函数: 功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果. 语法:group_concat( [distinct] 要连接的字段 [order b ...
- osg ifc数据渲染着色器
//顶点着色器 static const char* vertShader = { "varying vec4 color;\n" "void main(void)\n& ...
- js 加法
使用Number()函数可以解决这个问题,如下 var c = Number(a) + Number(b) 这样c得出来的解果是3,
- sublime Text3文件路径提示功能
1>启动sublime Text3编辑器: 2> 点开菜单“preferences”——“package control”: 3>在弹出的下拉框中选择“install package ...
- windows大全
1.win7系统如何显示隐藏的文件 参考连接:https://jingyan.baidu.com/article/da1091fbc6c7d2027849d628.htm ...
- 【VS2015软件报错】命名空间 system.windows 中不存在类型或命名空间名称 forms (是否缺少程序集引用 )错误
C#项目: 添加“using System.Windows.Forms;”之后提示“命名空间 system.windows 中不存在类型或命名空间名称 forms (是否缺少程序集引用 )”错误 详细 ...
- 用MOQ来Mock静态方法的 2种方法(含Moq和Fakes的配合使用)
Moq是无法直接模拟静态方法的,解决方式有两种: 1.需要修改正式代码,在源代码中建一个新的方法把静态方法包起来,调用的时候源代码调用时调用新方法而不是原来的静态方法. 在测试的时候,Mock掉这个新 ...