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)
(有待更新整理......)