学习sqlserve的一些笔记

来源:互联网 发布:桃之卵淘宝 编辑:程序博客网 时间:2024/04/30 01:10

切换数据库:use 数据库名

创建表:create table 表名
    {
      //定义列
      id int identify(1,1) primary key,     //列名:id,数据类型:int,自动编号:从1开始每次增长1,约束:主键约束
      name nvarchar(50) not null        //列名:name,数据类型:nvarchar长度为50,约束:非空约束
    }

表数据的增删改查:
          insert into 表名 values()
          delete from 表名
          update 表名 set
          select * from 表名
  注:当删除表中所有数据还可使用truncate table 表名,它不能加where条件但是比delect所有表数据效率高,因为它通过释放数据页来删除数据,在事务日志中只记录数据页的释放;而且删除数据后计数器重置为定义的种子,如果没有定义种子,则使用默认值1。

修改表结构:alter table 表名
              add 列名 数据类型                                          //增加一列
              drop column 列名                                            //删除一列
              alter column 表名 数据类型 not null                                    //修改一列,并添加非空约束
              add constraint PK_表名_列名 primary key(列名)                              //添加主键约束
              add constraint UQ_表名_列名 unique(列名)                                 //添加唯一约束
              add constraint DF_表名_列名 default(值) for 列名                              //添加默认约束
              add constraint CK_表名_列名 check(列的条件表达式)                            //添加检查约束
              add constraint FK_表名_列名 foreign key(外键表的列名) references 主键表名(主键表的列名)           //添加外键约束
              drop constraint 约束名1,约束名2............                                    //删除约束

去除重复记录:select distinct .... from 表名 ......      //对查询的结果集去重(针对每一列都相同的情况)

排序:select * from 表名 order by 列名 desc       //按照列名降序排序,默认为asc升序排序
  注:order by语句必须放在整个sql语句的后面。

查询数据前多少条:select top
              值                  //如:5,则表示查询该表前5条
              (表达式)                 //如:(2*2),则表示查询该表的前4条
              值 percent             //如:30 percent,则表示查询该表的前30%
                    * from 表名

模糊查询:
    通配符:_ 表示任意的单个字符 例如:select * from 表名 where 列名 like '张_'         //表示查询出 张字开头,单个任意字符结尾 的数据
        % 匹配任意多个字符 例如:select * from 表名 where 列名 like '%张%'        //表示查询出 包含张字 的数据
        [] 表示范围内的单个字符 例如:select * from 表名 where 列名 like '张[0-9]'     //表示查询出 张开头,0-9中任意数字结尾 的数据
        [^] 不在指定范围内的单个字符 例如:select * from 表名 where 列名 like '[^0-9]'   //表示查询出 不是0-9中任意数字 的单个字符

自定义转义符:escape
  例如:select * from 表名 where 列名 like '%/[%' escape '/'      //定义/为转义符,此语句表示查询出所有包含[的数据

空值判断:select * from 表名 where 列名
                    is null         //判断为空
                    is not null       //判断部位空

类型转换函数:cast(表达式 as 数据类型)、convert(数据类型,表达式[,格式])
  注:[]表示参数可写可不写。

联合结果集:union,union all
  例如:select 列名1,列名2 from 表1
                    union all
                         select 列名3,列名4 from 表2
  注意:联合的结果集列名默认使用第一个结果集中的列名,每个结果集必须有相同的列数,每一列的数据类型必须相容。
  区别:union会去除重复列,所以效率较低。

T-SQL:
    声明变量:declare @name nvarchar(50),@age int = 18
    为变量赋值:set @name = '张三'
    循环:while 条件
         begin
        ..........
         end
    条件判断:if 条件
         begin
          ....
         end
         else
         begin
          ...
         end

事务:
    特性ACID:
    原子性(Atomicity):事务是一个完整的操作,事务的各个步骤是不可分割的,要么全部执行,要么全都不执行。
    一致性(Consistency):当事务完成时,数据必须处于一致状态。
    隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。
    持久性(Durability):事务完成后,它对数据库的修改被永久保持。

  例子:
      begin transaction                    //开始一个事务
      declare @sum int = 0              //声明一个变量,记录sql语句出错次数
        sql语句1
        set @sum = @sum + @@error          //@@error:如果sql语句没有错返回0
        sql语句2
        set @sum = @sum + @@error
        if @sum <> 0                     //如果sum不等于0,表示有sql语句出错
        begin
          rollback                   //回滚
        end
        else
        begin
          commit                   //提交该事务
        end  

存储过程:
      执行存储过程:exec 存储过程名称
      创建存储过程:create proc 存储过程名称
             as
             begin
               .......
             end
      带参数的存储过程及执行:create proc usp_test                           //创建代参的存储过程
                  @name nvarchar(50),                         //定义参数
                  @age int output                                 //定义输出参数
                  as
                  begin
                    set @age = select 表.age from 表 where 表.name = @name    //参数的使用
                  end

                  declare @num int                            //声明一个变量,传递给输出参数
                  exec usp_test @name = '张三',@age = @num output          //执行带参的存储过程
                  print @num                                //输出变量,即输出参数的值

  例子(存储过程实现分页):

          create proc usp_getPage
          @pageSize int = 6,                                    //每页的条数
          @pageIndex int = 1,                                         //当前要查看第几页
          @pageCount int output,                                  //共多少页,输出参数
          @recordCount int output                                      //共多少条记录,输出参数
          as
          begin
            select *
            from (select * ,rownumber = row_number() over(order by id asc) from 表名) as temp          //将数据按id排序编号
            where temp.rownumber between (@pageIndex - 1)*@pageSize + 1 and @pageSize*pageIndex      //获取当前页的数据
            set @recordCount = (select count(*) from 表名)                               //计算表中记录
            set @pageCount = ceiling(@recordCount*1.0/pageSize)          //计算页数,ceiling()向上取整,即3.1页=4页
          end              

          //以下是执行存储过程
          declare @rc int,@pc int          //用于传递给输出参数
          exec usp_getPage @pageSize = 6, @pageIndex = 1, @recordCount = @rc output, @pageCount = @pc output   //执行带参数的存储过程
          print @rc                   //打印总记录条数
          print @pc                  //打印总页数

创建触发器:create trigger 触发器名称 on 表名
      after insert,delete,update //当进行增加、删除、修改时触发
      as
      begin
        ........
      end

0 0