zoukankan      html  css  js  c++  java
  • SQLServer(子查询,存储过程,透视,索引)

    存储过程:

    视图是对一个查询语句的封装,而存储过程:将一段t-sql脚本进行封装,对一段逻辑操作的封装。

    创建存储过程:
    create proc 名称 参数表 as begin end

    案例:去左右空格

    creat proc trim
    @str1 varchar(10)
    as
    begin

    select LTRIM(RTRIM(@str1))

    end

    在<可编程性>里面有<存储过程>里面有trim这个名

    用的时候:

    exec trim '参数'


    案例:
    编写存储过程,查询表中的总数居,以及当前页的数据
    分页的代码

    select * from (select * ,ROWNUMBER() over(order ba sid desc) as rowIdnex
    from StudentInfo where IsDelete=0) as t1 where rowindex between a and b


    --编写存储过程,查询表中的总数据,及当前页面的数据。
    exec proc GetPageList
    @pageIndex int,
    @pageSize int ,
    @rowsCount int output // 就相当与C#中函数out关键字。可以使用多次
    as
    begin
    SET NOCOUNT ON; // 执行存储过程的时候不会提示几行受印象了。

    select @rowsCount count(*) from StudentInfo where IsDelete=0


    select * from (select * ,ROWNUMBER() over(order ba sid desc) as rowIdnex
    from StudentInfo where IsDelete=0) as t1 where rowindex between (@pageIdnex-1)*@pageSize+1 and @pageIndex*@pageSize


    end

    调用的时候:
    declare @temp int

    exec GetPageList 1,2 @temp output

    print @temp

    就行了。

    记住存储过程的关键字就行了。


    .NET 中怎么调用存储过程呢。开始调用刚才的PageList


    private int pageIndex;
    pageIndex=1;
    private void LoadList()
    {
    string sql="GetPageList";//直接调用存储过程的名字
    using(Sqlconnection conn=new SqlConnection("server=.;database=dbtest;uid=sa;pwd=123")){
    SqlCommand cmd=new SqlCommand(sql,conn);
    //指定命令类型为存储过程
    cmd.CommandType=CommandType.StoredProcedure;
    //为存储过程。来构造参数
    SqlParameter pIndex=new SqlParameter("@pageIndex",pageIndex);
    SqlParameter pSize=new SqlParameter("@pageSize",3);
    SqlParameter pCount=new SqlParameter("@rowsCount",SqlDbType.Int); //这个是要输出的参数
    pCount.Direction=ParameterDirection.Output; //设置这个参数的属性。

    cmd.Parameters.Add{pIndex};
    cmd.Parameters.Add{pSize}; cmd.Parameters.Add{pCount};
    conn.open();
    SqlDataReader reader=cmd.ExecuteReader();
    //然后自己把reader里面的值格式化就行了。
    //那个要输出的参数的值,现在已经在参数里面了。
    }
    }


    索引:

    分类:
    聚集索引:与实际存储位置一样,一个表中只能有一个聚集索引,
    非聚集索引:索引顺序与存储顺序不一致。
    聚集索引只能有一个(做在主键上)
    如何做索引::
    界面上的操作:右击表-》设计,列上右键 》索引,添加-》选择列。 索引名的前缀是IX_ 是给这个列做索引。
    代码操作: create [unique]nonclustered index ix_索引名 on 表名(列名)
    数据多的时候才做索引。为where后面的列加索引。

    后期结合sqlserver->工具-》 SQL ServerProfiler这个东西运行一个星期后,会有 大量运行后语句,收集select语句看where后面的列,都有哪些,到时候可以加索引。

    子查询:将一个查询嵌套在另一个查询语句中
    常用运算符:=只能匹配一个值 in在这个值得范围内 exists和in的效果一样,但是效率in是拿外部的跟里面的比,exists distinct去重复,很重要。
    例子: 查询参加考试同学的信息
    select * from Student
    select * from ScoreInfo
    _____------

    select * from StudentInfo where stuid in(select distinct stuid from ScoreInfo 去从重复获取所有参加考试同学的ID)

    ------
    分页中常常用到子查询

     over()开窗函数一般用到两个方面,一个是聚合函数加到列里面,一个是排序的时候

    select *,ROW_NUMBER() over(order by sid desc) as rowIndex from StudentInfo
    where rowIndex between 5 and 6 //这里会发现rowIndex不能用,因为它会先执行where后的句子,所以这里要先把select的东西做成一个结果集,正确写法如下

    分页规律:
    开始:(pageIndex-1)*pageSize+1
    结束: pageIndex * pageSize


    select * from
    (select *,ROW_NUMBER() over(order by sid desc)as rowIndex from StudentInfo)as t1 where rowIndex between 5 and 8

    现有数据的整合:(数据透视)

    行变列。

    select sName 姓名,
    max(case sTitle when '语文' then scoreValue end) as 语文,
    min(case sTitle when '数学' then scoreValue end) as 数学,
    sum(case sTitle when '英语' then scoreValue end) as 英语
    from 表名

    这里的聚合函数如果不加就会出现重复,null,之所以用聚合中的三个数,是因为这三个数都是不参加运算的。括号里面:当sTitle的值为‘语文’的时候输出 scoreValue的值。

    输出每个班的男生和女生:
    select cTitle,
    mix(case sGender when '1' then count1 end else 0) 男生,
    min(case sGender when '0' then count1 end else 0) 女生
    from 表名 group by cTitle
    比如说知道每天的销售量显示出每月的销售量的表格

    T-sql编程。
    sql server特有的编码:关键字和规则和其他的完全不一样。


    声明变量:declare 变量名 类型 -----变量名以@开头,和C#中的参数化一样,也是要求以@开头为的就是成为这里的sqlserver中的变量?
    设置:set/select 变量名=值
    输出:print/select 变量名
    全局变量:使用@@符号, 有两个@@符号的变量,一般是系统内置变量 比方说常用的
    insert into ClassInfo values("新数据") select @@INENTITY 返回的就是刚刚插入数据的标识 ID。 @@INENTITY 进行插入后调用,返回最亲的标识值。
    @@error 有错误的话,返回的是错误的编号,没有的话返回0,单步执行
    print @@rowcount 返回的是上一次几行受影响的值。


    例子:
    declare @name nvarchar(10)
    set @name='这个文本'
    print @name

    begin try
    end try
    begin catch
    end catch

    选择语句:
    上面我们有讲到case在查询的时候对列进行的选择。if改变的则是你整个代码执行的顺序。

    declare @id int
    set @id=5
    if @id>5
    begin
    --满足条件执行的代码
    end
    else
    begin
    --不满足条件执行的代码
    end


    循环:

    declare @id int
    set @id=1
    while @id<10
    begin

    print @id
    set @id=@id+1
    end


    输出一到十之间的偶数

    declare @num int
    set @num=1;
    while
    begin
    if @num %2=0
    begin
    print @num
    end
    set @num =@num+1

    end

    事物: 能够保证在做一个批量的大量的操作的时候,如果有一个失败了,还能回到最初的状态。保证了操作的正确。
    只有数据改变了才会引发事物,也就是增删改。
    分类:
    显式事务(需要手动写)
    隐式事务(MSSQL默认的,不需要手动)

    begin try
    begin tran --设置反悔点 //这时候这个表就上锁了。。查询的时候是查不出来的。
    sql语句
    commit tran提交不返回
    end tyr
    begin catch
    rollback tran 回到反悔点
    end catch
    回到返回点后数据也都回到返回点了,就相当于什么也没删,什么也没有变过。


    锁:加锁后只能有一个人进行这个操作,防止多人操作出乱。


    有外键表的增删改查和无外键表的一样,但是为了保证值得有效性,一般是把他引用的那个表的列做成下拉列表的格式,让用户去选。
    现在比如说你想删除一条数据,就要先把引用他的表中的数据给删了。(一般先提示,比如你要删一个班级,就告诉你班级里还有学生,你要先把学生删了。还有一种是软删除,就是改了一个标记为0)

     (有待更新整理......)

  • 相关阅读:
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
    C语言I博客作业03
    C语言第二周作业
    C语言第一周课程作业
    C语言期末总结
    第一次作业
    C语言I博客作业09
  • 原文地址:https://www.cnblogs.com/liuwenxu/p/6437825.html
Copyright © 2011-2022 走看看