zoukankan      html  css  js  c++  java
  • sql server 分页、存储过程、视图

    基础

      --先复习sql基础
      --查询语句执行顺序
      --from→where→group by→having→select(column(列)→distinct→top) 
      select * from Info;
      --将数据取出存放到临时表中 #temp局部临时表 ##temp全局临时表
      select * into #temp from(select * from Info) as t; 
      --查询临时表
      select * from #temp;
      --删除临时表
      drop table #temp;
      --删除数据
      delete from Info where uId>1000000
       
      --与delete区别:truncate删除数据快,会重置自增长主键的默认值,不触发delete触发器
      truncate table Info
       
      --变量 
      --用@来声明局部变量 先声明,后赋值 如:@Id
      --用@@来声明全局变量  内置常用的有:@error 返回错误号
      --                                  @identity 返回上次插入的主键Id、
      --                                  @rowcount 返回上次操作影响的行数
      --定义变量并初始化值不然,就是null
      declare @a int set @a=0
      print @a
      declare @b int set @b=1
      print @b
      declare @sum int set @sum=@a+@b
      print @sum
       
      --if语句
       if @sum>@a
         begin
             print '城管强'
         end
       else
         begin
             print '拆迁队牛'
        end
       
      --while语句
      declare @value int set @value=0
      declare @sum int set @sum=0
      while @a<100
      begin
        set @a=@a+1
        set @sum=@sum+@a
      end
      print @sum
    

        上面主要是为了存储过程、及游标做准备的!

    视图

      --先复习sql基础
      --查询语句执行顺序
      --from→where→group by→having→select(column(列)→distinct→top) 
      select * from Info;
      --将数据取出存放到临时表中 #temp局部临时表 ##temp全局临时表
      select * into #temp from(select * from Info) as t; 
      --查询临时表
      select * from #temp;
      --删除临时表
      drop table #temp;
      --删除数据
      delete from Info where uId>1000000
       
      --与delete区别:truncate删除数据快,会重置自增长主键的默认值,不触发delete触发器
      truncate table Info
       
      --变量 
      --用@来声明局部变量 先声明,后赋值 如:@Id
      --用@@来声明全局变量  内置常用的有:@error 返回错误号
      --                              @identity 返回上次插入的主键Id、
      --                              @rowcount 返回上次操作影响的行数
      --定义变量并初始化值不然,就是null
      declare @a int set @a=0
      print @a
      declare @b int set @b=1
      print @b
      declare @sum int set @sum=@a+@b
      print @sum
       
      --if语句
       if @sum>@a
         begin
             print '城管强'
         end
       else
         begin
             print '拆迁队牛'
        end
       
      --while语句
      declare @value int set @value=0
      declare @sum int set @sum=0
      while @a<100
      begin
        set @a=@a+1
        set @sum=@sum+@a
      end
      print @sum
    

    存储过程

       --存储过程是一段可执行服务端程序(类似方法)
       --优点:执行速度更快;允许模块化程序设计(复用);提高系统安全(防止SQL注入);减少网络流通量
       create proc usp_UserDefineProcedure
       @paremeterA int,
       @paremeterB int,
       @totalSum int output
       as
       begin
       set @totalSum=@paremeterA+@paremeterB
       if(@totalSum < 10)
            begin
             print 'so easy!'
            end
        else
          begin
             print 'too difficult'
          end
       end
       --声明变量 
       declare @Sum int
       exec usp_UserDefineProcedure 1,8,@totalSum = @Sum OUTPUT --执行存储过程 有参数的后跟参数(有输出参数 要先定义变量)
       print @Sum
       --删除存储过程
       drop proc usp_UserDefineProcedure
    

    事务

     --事务允许你定义一个操作单元,要么全部成功,要么全部失败
     --开启事务
     begin tran
     declare @error int =0 --声明一个局部变量 接收全局@error
     set @error=@error+@@ERROR
     update  TblScore set tEnglish=59 where tScoreId=1
     set @error=@error+@@ERROR
     if(@error<>0)
        begin
         rollback tran;
         print 'update failed'
        end
     else
        begin
         commit tran;
         print 'success'
        end  
    

    游标

    --简单使用
    --定义游标 有多种游标 fast_forward for/
      declare cur_MyInfo cursor fast_forward for select * from Info
    --打开游标
      open cur_MyInfo
    --对游标进行操作
    --单行操作
    --fetch next from cur_MyInfo
    --多行操作
    --@@FETCH_STATUS说明 0代表 fetch语句执行成功 -1fetch语句失败或行不在结果集中 -2提取的行不存在
     while @@FETCH_STATUS=0
       begin
         fetch next from cur_MyInfo
       end
    --关闭游标
      close cur_MyInfo
    --释放游标
      deallocate cur_MyInfo
    

    多表连接加分页查询

    SELECT  *
    FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY tree.Id ) AS rownum ,
                        tree.Id AS tid ,
                        tree.Name AS NAME ,
                        inde.Info AS info ,
                        inde.Title AS title
              FROM      dbo.T_Tree AS tree
                        INNER JOIN dbo.T_IndexInfo AS inde ON tree.Id = inde.Id
            ) AS t
    WHERE   rownum BETWEEN 1 AND 2
    

    常用的分页语句

        --取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的
       --以上免为例(很多面试都会有这道题)
       --第一种 not in
       --先查询一部分数据排序,排除在外;适合用与sql server 2000及更高版本
       select top 10 * from Info where uId not in (select top 30 uId from Info order by uId)order by uId
        
       --第二种 先查出一部分数据 排序 用Max找出最大Id 然后将其Max(uId)最大排除在外;适合用与sql server 2000及更高版本
       select top 10 * from Info
       where uId >
                 (
                 select ISNULL(MAX(uId),0)  
                 from
                       (
                       select top 30 uId from Info order by uId
                       ) a
                 )
       order by uId
        
       --第三种 row_number
       --把所有的数据查询出来,进行重新编号,通过where条件进行筛选数据;适用于sql server2005及更高版本
         select top 10 * from (select row_number() over (order by uId) as rowId,* from Info)t where rowId>30
        
       --第四种 offset fetch
       --offset后参数 越过多少条 fetch next后参数 取多少条;适用于sql server2012
       select * from Info order by uId offset (30)row fetch next 10 rows only
    

    下面表格简单数据量不大的测试

    方式取1000排除10000取1000排除100000取1000排除500000取10000排除100000取10000排除500000取10000排除900000
    not in 75  133 1085 377 719 1035
    max 82 76 236 205 270 1037
    row_number 126 955 662 1040 4785 2618
    offset fetch 79 407 186 180 239 882

    offset要比row_number/not in/max方式要好,简洁更给力,not in/max(更通用)
    小数据的情况下 max最好 offset次之 紧跟not in 最后row_number

    作者:秋壶冰月
    出处: http://www.cnblogs.com/qq0827
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    DNS正向反向解析
    varnish-4.0.5的反向代理 缓存测试 负载均衡实验
    DS8700 硬盘更换略
    ftp虚拟用户
    maven mvn 命令行 编译打包
    linux下的springboot项目启动文件
    linux系统安装gcc
    linux系统下安装两个或多个tomcat
    linux系统的磁盘挂载
    常用linux命令
  • 原文地址:https://www.cnblogs.com/qq0827/p/2985095.html
Copyright © 2011-2022 走看看