1.批处理
批处理语句我们并不陌生,前面使用过的GO就是批处理的标志。它是一条或多条SQL语句的集合。SQLServer将批处理语句编译成一个可执行的单元,此单元称为执行计划。每个批处理可以编译成单个执行计划,从而提高执行效率。批处理的好处:简化数据库的管理
2.变量
变量:存储数据值的。在T-SQL中执行一批sql语句,可以声明许多变量以便临时使用。声明变量以后,可以在批处理中用一条数据设置该变量的值。由于上下语句中传递数据。
局部变量:在局部声明的变量
语法:
DECLRE@变量名 数据类型
赋值:
SET :一般用于赋值给变量指定的常量
SELECT :用于从表中查出来,在赋值给变量
注意:数据不能多于一条。
全局变量:由系统定义和维护,我们可以直接使用,一般不自定义全局变量
表量 | 含义 |
@@ERROR | 最后一个T-SQL错误的错误号 |
@@IDENTITY | 最后一次插入的标识值 |
@@Language | 当前使用语言的名称 |
@@MAX_CONNECTIONS | 可以创建的同时连接的最大数目 |
@@ROWCOUNT | 受上一个SQL语句影响的行数 |
@@SERVERNAME | 本地服务器的名称 |
@@SERVICENAME | 该计算机上的SQL服务的名称 |
@@TRANCOUNT | 当前连接打开的事务数 |
@@VERSION | SQLSERVER的版本信息 |
局部变量
1. 简单子查询2. in 子查询3. exists 子查询4. 相关子查询
连表查询可以被子查询代替, 子查询不一定可以被连表查询代替
相关子查询
事务
保障一件事情必须成功,不成功则回滚所有操作。(不成功则成仁)不相关子查询
事务分类
①、显示事务
1.--开始事务 begin transaction
2.--提交事务 commit transaction
3.--回滚事务 rollback transaction
②、隐式事务
SET IMPLICIT_TRANSACTIONS ON
SQLSERVER的默认模式,如果成功执行,则自动提交,如果失败,则全部回滚。
聚集索引(聚类索引,簇集索引,数据页和索引的顺序一致)
- create clustered index IX_TEST_TNAME --创建一个非聚集索引
- ON 表名(列名) --为TEST表的TNAME字段创建索引
- WITH FILLFACTOR = 30 --填充因子为30%
- 使用聚集索引的场合为:
- a.此列包含有限数目的不同值;
- b.查询的结果返回一个区间的值;
- c.查询的结果返回某值相同的大量结果集。
- d.以最快的速度缩小查询范围。
- e.以最快的速度进行字段排序。
非聚集索引(非聚类索引,非簇集索引,数据页顺序和索引顺序不一致)
- create nonclustered index IX_TEST_TNAME --创建一个非聚集索引
- ON 表名(列名) --为TEST表的TNAME字段创建索引
- WITH FILLFACTOR = 30 --填充因子为30%
- 【填充因子】低更改的表(读写比率为100:1):100%的填充因子;高更改的表(写超过读):50-70%的填充因子;读写各一半的:80-90%的填充因子
- 使用非聚集索引的场合为:
- 1.此列包含了大量数目不同的值;
- 2.查询的结束返回的是少量的结果集;
- 3.order by 子句中使用了该列。
- 索引在什么时候用?(对的时间,对的地点,用对的索引)
- 对的时间:数据量100w海量的时候
- 对的索引:号码用非聚集,订单有日期用聚集。
- 对的地方:性别列不能。
动作描述 | 使用聚集索引 | 使用非聚集索引 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
列经常被分组排序(order by) | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
频繁修改索引列 | 不应 | 应 |
一个或极少不同值 | 不应 | 不应 |
事务实例
use master;
--创建银行账户表
create table BankAcoount(
name varchar(20)
,money int
)
go
--追加余额不能为负数的约束
alter table BankAcoount
add constraint CK_money check(money>=0)
go
--多行插入2条测试数据
insert into BankAcoount
select '枫哥',0
union
select '王健林',2000
select * from BankAcoount;
--转账:王健林给枫哥转3000
--1、王健林帐号余额减少3000
update BankAcoount set money-=3000 where name = '王健林'
--2、枫哥帐号余额增加3000
update BankAcoount set money+=3000 where name = '枫哥'
--使用事务来解决
begin transaction; --开启事务
declare @s int = 0;
--使用系统变量错误码@@error
update BankAcoount set money-=1000 where name = '王健林'
set @s = @s+@@error;
update BankAcoount set money+=1000 where name = '枫哥'
set @s = @s+@@error;
if(@s=0)
commit tran; --提交事务
else
rollback tran;--回滚事务