zoukankan      html  css  js  c++  java
  • sql之浅谈视图的作用



    【数据库】☆★sql之浅谈视图的作用


        在一个项目的实际开发过程中牵涉到复杂业务的时候,我们不可避免的须要使用中间表来进行数据连接,有的同学就说了,我能够採用Hibernate进行主外键进行关联啊?多对多,多对一,一对一,等,採用主外键关联在数据的操作过程中具有非常强的耦合性,尤其对于须要常常删改数据表而言,我们是不建议採用主外键关联这样的模式,那么,假设我们採用中间表的话,当数据过大在性能上又面临严峻考验,sql视图的出现,在解决中间表的业务逻辑上是不错的选择。ok,首先我们了解什么是视图?


        1、视图是表?没错,可是是一张虚拟表,视图的字段是由我们自己定义的,视图仅仅供查询,数据不可更改,查询数据来源于我们建立的实体表。


        2、使用视图的优势?视图能够将多个复杂关联表,提取出我们须要的信息,优化查询速度。


       怎样创建视图?


    我们先建立三张表;例如以下:


    wKioL1Ptjj-gJ6DEAACEukazCYo267.jpgwKiom1PtjSejuuUnAACB0OJ87yg643.jpgwKioL1PtjkDT7Lq1AAB61axLMaw679.jpg



    这个是典型的一对多和一对一的关系,那么,假如每张表的数据都在一万条数据以上,如今查询在潢高上学的学生姓名

    首先,我们分析一下,在潢高上学?首先是一个高中,那么我们会有一条Sql where school='潢高',

    查询出一个List,得到gradeids,然后再到grade中依据gradeids查询这么多grades相应的studentids,在使用这些studentsid查询出students循环最后得到name?


    是不是非常累赘?查询是不是非常影响性能?


    观察得知,这三张表每两张表之间都是通过id进行关联的,假设我们通过id将三张表组成一张表,是不是非常方便?


    我们来关联学校表和年级表:这个年级ID我们不要,ok?


    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;


    wKioL1PtkubC7NSTAAB2kqmCXfY098.jpg


    那么我们再关联上学生表,学生表的id等于年级表的studentid ok?

    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;

    ok,到了这里?我们再看执行结果?


    wKioL1Ptk-SAsUfIAAC4KIhRufE356.jpg


    那么我们想查询在潢高上学的学生姓名,where schoolName='潢高',获取的list循环得到Object,通过Object.getStudentName,就能够了?


    所以须要将查询到的结果,建立为一张虚拟表,这样才干操作,通过这个create view 视图名 as 命令建立:


    意思就是将查询结果创建为名称为table_sgt的一张虚拟表:

    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);


    wKioL1PtlZuQiR_8AABou7EhE2g895.jpg



    wKiom1PtlKyj-cb_AAEt4kosx98924.jpg


        我们在使用视图的时候,须要把它看做为一张表,建立一张实体表须要做的步骤,视图也都须要(比如,实例化,配置映射文件,对象的属性get,set方法)


        注意视图所查询出来的数据仅仅能进行查看,不能增删改!


        样例数据库为Mysql5.5,工具Navicat for MySQL


        ok,有问题请举手?



  • 相关阅读:
    T-SQL---多值模糊查询的处理
    SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率
    SQL Server创建复合索引时,复合索引列顺序对查询的性能影响
    Sql Server 聚集索引扫描 Scan Direction的两种方式------FORWARD 和 BACKWARD
    Sql Server 内存相关计数器以及内存压力诊断
    通过手动创建统计信息优化sql查询性能案例
    对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗
    Buffer cache hit ratio性能计数器真的可以作为SQL Server 内存瓶颈的判断指标吗?
    sqlserver 存储过程中使用临时表到底会不会导致重编译
    权限 位运算
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4022093.html
Copyright © 2011-2022 走看看