zoukankan      html  css  js  c++  java
  • 【T_SQL】 基础 视图、存储过程、触发器

            合作对于我来说,真的很重要,不仅仅是我从中学到了什么技术,更加重要的是我从中学到了如何去协调,如何去处理团队之间的关系,不要误会,我不是组长,但是我们每个人都是组长。在漫长的编译代码的过程中,真的很烦,但是如何我们能够透过代码去学习这些东西,还是很有价值的。

            合作的过程中,我负责的编译D层的代码,既然是编译D层,那避免不了和数据库去打交道,简单的SQL语句就不需要再向大家介绍了,而大家更多的人为有点技术含量的的可能就是如何运用“视图”、“触发器”、“存储过程”了,也就是数据库中的企业管理器,非常之强大,但遗憾的是,个人重构的时候,我倒是没有怎么用过触发器和视图,所以,在合作的时候,我决定,一定要用,用之前淡然是学习了。期间,用了几个,感觉真的很方便,最起码,节省代码。

    (一)视图
             1、定义:
         在SQL中,外模式一级数据结构的基本单位是视图(view),视图是从若干基本表和(或)其他视图构造出来的表。这种构造方法采用SELECT语句实现。
             2、为什么要使用视图:
           就拿我们的机房来说,当我们学生上机成功后,界面上需要显示卡的信息和学生的信息(部分或者全部),而且这两张表之间是存在关系的,因为卡和学生的学号是绑定的,依存关系。如果要是以前,我们就会写两个SELECT语句来从两张表里面分别读取所需要的数据,麻烦,费事,烦。现在,我们学习了视图,直接建立一下以这两张表为基本表的视图,一张全新的表(虚表,帮助我们把分布在不同表中的信息搜集整理出一张新表),一切问题都解决了,再多的表(有依存关系或者说是一对一关系),我们一个视图搞定。而且创建一个视图实际就是编写Seclect语句。
             3、使用视图有什么好处?又有什么缺点
                   优点: 
             一,视图着重于特定数据。
      视图可以让用户或者程序开发人员只看到他们所需要的数据,而不需要把表中的所有信息与字段暴露出来,这样增强了数据的安全性。
           二,简化数据的操作,易维护。
     我们可以将经常用到的多表联合查询出来的数据,或特定的结果集定义为视图,这样就起到了模块化数据的作用。我们在使用这些数据时直接查询该视图就可以,而不用到处写长长的SQL语句,这样也起到易维护的作用。
            三,视图可以限定查询数据。
    比如:对于不同的用户,我们只提供部分数据给他。这样,我们就可以在视图中限定结果集,然后返回该视图给他。这样,无论用户怎么对视图定义查询条件,他也不能查询出我们不想提供给他的数据。
      缺点:
    虽然视图可以给我们带来种种便利,但不意味着我们就可以滥用它。因为视图其实就是一段SQL语句,所以它的结果都是每次调用时动态生成的。如果不合理的定义视图,必然带来性能上的损耗。
      下面是我们在创建视图应该要注意的几点:
    ,操作视图会比直接操作基础表要慢,所以我们尽量避免在大型表上创建视图。
    ,尽量不要创建嵌套视图,就是在视图中使用视图。 这样在查询时,会多次重复访问基础表,带来性能损耗。
    ,尽量在视图只返回所需的信息,尽量不要在视图使用不需要访问的表。
    ,在大型表或者复杂定义的视图,可以使用存储过程代替。
    ,频繁使用的视图,可以使用索引视图来代替。
              
    4、注意点:
            有的人说视图只能用来读取数据,其实,视图上也可以进行增删改的操作,但是前提:只能影响一张基本表


    5、视图的创建和撤销

        创建:
    1、语句创建:新建查询:
     create view V_Card_Stu   --要创建的视图名
    as select T_card.cardNo ,T_card.head,T_Student.studentNo,T_Student.studentName   --要选择的字段
    from T_Card,T_Student    --基本表
    where T_card.studentNo=T_Student.studentNo        --关系
    2、手动创建:
    +

    确定,就好了,记得保存

    至于撤销,方法一,删除视图就可以,方法二,Drop view +视图名称就O了


    (二)触发器
                    
    1、定义
    触发器是SQL Server提供给程序员和数据分析员来保证数据完整性的一种方法,他是与表事件相关的特殊的存储过程,触发器不能被直接执行,它们只能为表上的Insert、Update和Delete事件所触发,此外也不能够传递或接受参数。
                   
         
    2、怎么用?
    触发器不能被直接执行,它们只能为表上的Insert、Update和Delete事件所触发,此外也不能够传递或接受参数。每个表下都有触发器这一项,所以,只要在触发器上右击创建新触发器就可以了
                    
        
    3、在哪儿用?
    应用到我们的机房上就是,当我们退卡成功的时候,我们的退卡表里面有添加(insert),而同时,我们的卡表里面要删掉对应的卡信息(delete),我们的学生表里面也要删掉相应的学生信息(delete),那这就是一个很直观的例子:



    但是语句创建的时候不用这么写的:
    对应起来就哦了

    4、注意点:
    以前只知道三种触发事件,insert,update,delete,但是不知道update如何取旧数据,现在知道了,当时update触发器的时候,inserted为新数据表,deleted为旧数据表
     


    (三)存储过程
                    
    1、定义:
    存储过程是存放在服务器上的预先编译好的SQL语句,在第一次执行时进行语句检查和编译,编译好的存储过程在高速缓存中用于后续调用,这样就可以使存储过程执行时更加迅速,更加高效。存储过程可以带有输入和输出的参数。
                    
    2、优点
    主要有提供了安全机制,改进了执行性能,减少了网络流量和增强了代码的重用性,执行速度快。
                       
    3、 缺点:
                          
    1、SQL本身是一种结构化查询语言,加上了一些控制(赋值、循环和异常处理等),但不是OO的,本质上还是过程化的,面对复杂的业务逻辑,过程化的处理会很吃力。这一点算致命伤。

    2、不便于调试。基本上没有较好的调试器,很多时候是用print来调试,但用这种方法调试长达数百行的存储过程简直是噩梦。好吧,这一点不算啥,C#/java一样能写出噩梦般的代码。

    3、没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。


    4、怎么用?在哪用?
    存储过程大家都很熟悉了,机房里面应用最多的就是我们的组合查询,其实在注册的时候也可以用的,也很方便的
    图片不是我的,但是真的很清晰的,一目了然

                    
          总结:
                三种利器,很大方面的方便了我们的代码编译,给我们的合作解决了不少问题,同时也提出很多问题,这时刻警醒我们学习之路还很长。对于这三种企业管理器,从最初的陌生到现在的熟练运用,这就是学习。老师说过,什么东西都有两面性,有利就有弊,所以,适合才是最好
  • 相关阅读:
    JZ5 替换空格
    数学分析 H 1 复习要点(部分)
    算法贪心
    Python之位运算
    sorted复杂排序cmp_to_key
    算法位运算
    Python3新特性总结 持续更新
    算法树
    H5 ios端微信浏览器下底部工具固定方法
    Eclipse 安装windows10环境
  • 原文地址:https://www.cnblogs.com/DoubleEggs/p/5747189.html
Copyright © 2011-2022 走看看