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 @[email protected]+1
end

输出一到十之间的偶数

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

end

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

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

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

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

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

时间: 2024-12-28 14:15:11

SQLServer(子查询,存储过程,透视,索引)的相关文章

SQLServer分页查询存储过程

项目中用到的SQLServer分页查询存储过程. [存储过程] create PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage int = 1,                         --当前页页码 (即Top currPage) @showColumn varchar(2000) = '*',           --需要得到的字段 (即 column1,column2,......) @strCondition varchar(200

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两

【MySQL】MySQL/MariaDB的优化器对in子查询的处理

参考:http://codingstandards.iteye.com/blog/1344833 上面参考文章中<高性能MySQL>第四章第四节在第三版中我对应章节是第六章第五节 最近分析生产环境慢查询,发现上线很久但是效率不高的查询 MySQL版本5.5.18 SELECT loc.cell_no AS m_cellNo ... FROM bs_loc loc LEFT JOIN st_stock_m m ON loc.cell_no = m.cell_no WHERE loc.zone_n

MySql优化子查询

用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM t2 ORDER BY column1); SELECT * FROM t1 WHERE t1.column1 IN (SELECT DISTINCT column1 FROM t2); SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 LIMIT 1)

SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)

SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提, 假设Books表如下: 类编号 图书名 出版社 价格 -------------------------------------------------------- 2 c#高级应用 圣通出版 23.00 2 Jsp开发应用 机械出版社 45.00 3 高等数学 济南出版社 25.00 3 疯狂英语 清华大学出版社 32.00 嵌套子查询的执行不依赖与外部的查询. 执行过程: (1)执行子查询,其结果不被显示,而是传递

MySQL中IN子查询会导致无法使用索引

原文:MySQL中IN子查询会导致无法使用索引 今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table test_table2 ( id int a

Sqlserver 使用CTE如何按子查询排序?

Sqlserver 使用CTE如何按子查询排序? 需求:查出最近有更改的客户信息(按最后更改时间排序,来自SystemLog表LogDateTime字段) 说明: Customer:客户信息表SystemLog:系统日志表,记录所有表信息的增,删,改 自己公司开发的行业软件,不仅自己公司有在用,其他公司也在用,本公司进行软件维护和提供升级服务由于之前的设计客户信息表并没有更改时间字段,而现在该系统已经在N个不同的数据库里运行导致不能随意更改数据库结构(虽然可以升级,但代价太大) 不能使用视图及存

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

sqlserver中的 数据转换 与 子查询

原文:sqlserver中的 数据转换 与 子查询 数据类型转换 --cast转换 select CAST(1.23 as int) select CAST(1.2345 as decimal(18,2)) select CAST(123 as varchar(10))     整型转换成字符串型 select CAST('123.333' as decimal(18,4))    字符串型转换成浮点型 --convert转换 select CONVERT(int,12.345) 子查询(嵌套查