9.视图
  优点:
  筛选表中的行
  防止未经许可的用户访问敏感数据
  降低数据库的复杂程度
  创建视图
  create view v_Demo
  as
  select ......
  10、局部变量
  ---------------------------------局部变量--------------------------
  --声明变量:使用declare关键字,并且变量名已@开头,@直接连接变量名,中间没有空格。必须指明变量的类型,同时还可以声明多个不同类型的变量。
  declare @name nvarchar(30) ,@age int
  --变量赋值:
  --1、使用set 给变量赋值,只能给一个变量赋值
  set @age=18
  set @name ='Tianjia'
  select @age,@name  --输出变量的值
  --2、使用select 可以同时为多个变量赋值
  select @age=19,@name='Laoniu'
  --3、在查询语句中为变量赋值
  declare @sum int =18 --为变量赋初值
  select @sum= SUM(english) from Score --查询语句中赋值
  select @sum --输出变量值
  --4、变量作为条件使用
  declare @sname nvarchar(10)='张三'
  declare @sage int
  select @sage=sage from student where sName=@sname
  select @sage
  --5、使用print输出变量值,一次只能输出一个变量的值,输出为文本形式
  print @sage
  11、全局变量
  --------------------------全局变量(系统变量)----------------------------------
  select * from student0
  select  @@error --后一个T-SQL错误的错误号
  select @@max_connections--获取创建的同时连接的大数目
  select @@identity --返回近一次插入的编号
  12、事务
  事务:同生共死
  指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)–也是由多个sql语句组成,必须作为一个整体执行
  这些sql语句作为一个整体一起向系统提交,要么都执行、要么都不执行
  语法步骤:
  开始事务:BEGIN TRANSACTION
  事务提交:COMMIT TRANSACTION
  事务回滚:ROLLBACK TRANSACTION
  判断某条语句执行是否出错:
  全局变量@@ERROR;
  @@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;
  ---------------------------模拟转账----------------------------
  declare @sumError int=0 --声明变量
  begin tran
  update bank set balance=balance-1000 where cId='0001'
  set @sumError=@sumError+@@error
  update bank set balance=balance+1000 where cId='0002'
  set @sumError=@sumError+@@error
  if (@sumError=0)
  commit tran --提交成功,提交事务
  else
  rollback tran --提交失败,回滚事务
  13、存储过程
  存储过程—像数据库中运行方法(函数)
  和C#里的方法一样,由存储过程名/存储过程参数组成/可以有返回结果。
  前面学的if else/while/变量/insert/select 等,都可以在存储过程中使用
  优点:
  执行速度更快 – 在数据库中保存的存储过程语句都是编译过的
  允许模块化程序设计 – 类似方法的复用
  提高系统安全性 – 防止SQL注入
  减少网络流通量 – 只要传输 存储过程的名称
  系统存储过程
  由系统定义,存放在master数据库中
  名称以“sp_”开头或”xp_”开头
  创建存储过程:
  定义存储过程的语法
  CREATE  PROC[EDURE]  存储过程名
  @参数1  数据类型 = 默认值 OUTPUT,
  @参数n  数据类型 = 默认值 OUTPUT
  AS
  SQL语句
  参数说明:
  参数可选
  参数分为输入参数、输出参数
  输入参数允许有默认值
  EXEC  过程名  [参数]
  ----------------------例--------------------------
  if exists (select * from sys.objects where name='usp_GroupMainlist1')
  drop proc usp_GroupMainlist1
  go
  create proc usp_GroupMainlist1
  @pageIndex int, --页数
  @pageSize int, --条数
  @pageCount int output--输出共多少页
  as
  declare @count int --共多少条数据
  select @count =count(*) from [mainlist] --获取此表的总条数
  set @pageCount=ceiling(@count*1.0/@pageSize)
  select * from
  (select *,row_number() over(order by [date of booking] desc) as 'num' from [mainlist]) as t
  where num between(@pageSize*(@pageIndex-1)+1) and @pageSize*@pageIndex
  order by [date of booking] desc
  -------------------------------------------------------------------------------------------
  --调用  
  declare @page int
  exec usp_GroupMainlist1 1,100,@page output
  select @page
  14、常用函数
  1)ISNULL(expression,value)     如果expression不为null返回expression表达式的值,否则返回value的值
  2)聚合函数
  avg()  -- 平均值 统计时注意null不会被统计,需要加上isnull(列名,0)
  sum() -- 求和
  count() -- 求行数
  min() -- 求小值
  max() -- 求大值
  3)字符串操作函数
  LEN() --计算字符串长度
  LOWER() --转小写
  UPPER () --大写
  LTRIM() --字符串左侧的空格去掉
  RTRIM () --字符串右侧的空格去掉
  LTRIM(RTRIM('         bb        '))
  LEFT()、RIGHT() -- 截取取字符串
  SUBSTRING(string,start_position,length)
  -- 参数string为主字符串,start_position为子字符串在主字符串中的起始位置(从1开始),length为子字符串的大长度。
  SELECT  SUBSTRING('abcdef111',2,3)
  REPLACE(string,oldstr,newstr)
  Convert(decimal(18,2),num)--保留两位小数
  4)日期相关函数
  GETDATE() --取得当前日期时间
  DATEADD (datepart , number, date )--计算增加以后的日期。参数date为待计算的日期;参数number为增量;参数datepart为计量单位,可选值见备注。DATEADD(DAY, 3,date)为计算日期date的3天后的日期,而DATEADD(MONTH ,-8,date)为计算日期date的8个月之前的日期
  DATEDIFF ( datepart , startdate , enddate ) --计算两个日期之间的差额。 datepart 为计量单位,可取值参考DateAdd。
  -- 获取日期的某一部分 :
  DATEPART (datepart,date)--返回一个日期的特定部分 整数
  DATENAME(datepart,date)--返回日期中指定部分 字符串
  YEAR()
  MONTH()
  DAY()
  15、sql语句执行顺序
  5>…Select 5-1>选择列,5-2>distinct,5-3>top
  1>…From 表
  2>…Where 条件
  3>…Group by 列
  4>…Having 筛选条件
  6>…Order by 列