创建数据库Sales,指定数据库文件和日志文件
create database Sales
on
(name='sales_dat',filename='d:\database\Salesdat.mdf',
size=10,
maxsize=50,
filegrowth=5)
log on
(name='Sales_log',filename='d:\database\salelog.ldf',
size=5MB,
MAXSIZE=25MB,
FILEGROWTH=5MB)
修改数据库并立即分配空间
alter database Sales
add file
(
name=Salestest,
filename='d:\database\Salestest.mdf',
size=5mb,
maxsize=100mb,
filegrowth=5mb
)
删除数据库
drop database Sales
使用变量声明方式创建临时表
declare @tablevar table
(Cno int,Cname char(3))
insert into @tablevar values(1,'abc')
select * from @tablevar
select
@@SERVERNAME --显示当前服务器名
exec
sp_dropserver 'shenymce\shenymce' --删除当前服务器名
exec
sp_addserver 'shenymce',’local’ --新建数据库服务器名只针对于以机器命名的服务器
create
database one --创建数据库
use
one --打开数据库
create
table tt (id int,name char(10))--创建表
create
table #T (id int,name char(10)) --创建本地临时表
create
table ##T (id int,name char(10)) --创建全局临时表
select
* from tt --显示表信息
exec
sp_rename 'tt','ttt' --修改表名
exec
sp_help ttt --显示表结构
alter
table ttt add sex bit --添加新列
alter
table ttt alter column sex char(2)--修改列
select
* from ttt
alter
table ttt drop column sex --删除列
exec
sp_rename 'ttt.name',username --更改列名
判断表是否存在
if
not exists(select * from sysobjects where [name] = 'ttt' and xtype='U')
begin
select '测试'
end
修改数据库名称
use
one
go
alter
database one modify name=测试
查看数据库详细信息
exec
sp_helpdb 测试
创建数据库快照
create
database test_snap
on
(name=test,filename='D:\Program Files\Microsoft SQL Server\MSSQL10.SHENYMCE\MSSQL\DATA\test_!.mdf')
as
snapshot of test
name后的test和of 后的test都是源数据库锃
filename后跟的是新建快照的文件路径不可以与源数据库的路径相同
还原快照
restore
database test--数据库名
from
database_snapshot = 'test_snap'--快照名
删除数据库快照
drop
database test_snap --删除数据库快照与删除数据库类似
创建临时表
CREATE
TABLE #MyTempTable (cola INT PRIMARY KEY);--本地临时表,表名前加‘#’
INSERT
INTO #MyTempTable VALUES (1);--全局临时表,表名前加‘##’
除非使用
DROP TABLE 显式删除临时表,否则临时表将在退出其作用域时由系统自动删除:
--创建规则
create
rule age
as
@age
between 0 and 100
--绑定规则
sp_bindrule
age,'tt.shuxue'--参数:规则名,参数:对应表的列名
解除绑定
sp_unbindrule
'tt.shuxue'--对指定列解除规则绑定
删除规则
drop
rule age--删除规则,只有不绑定任何列的规则才可以被删除
创建视图
create
view v_info
as
select
a.name,b.shuxue,b.yuwen,b.zongfeng
from
info as a,tt as b where a.id=b.id
创建索引(下面创建的是一个唯一非聚集索引)
create
unique nonclustered index i_info
on
info(xuehao)
创建架构
create
schema one authorization [guest] --one架构名guest所有者
分组
id sx yw zf sex
1
10 20 30 boy
2
30 40 70 girle
3
44 33 77 boy
4
55 66 121 boy
5
77 88 165 girle
select
sum(shuxue) as sxzf,sex from tt group by rollup (sex)
sxzf sex
109
boy
107
girle
216
NULL
Group by 有二个关键字rollup和 cube
Having 子句
select
sum(shuxue) as sxzf,sex from tt group by (sex)
having
sum(shuxue)>=108
update 中的from 子句
update
info
set
zongfeng=b.shuxue+b.yuwen
from
info a join tt b on a.id=b.id
上面语句的含义是,当info表中的id=tt表中的id时从tt表中更新info表中的zongfeng, (join on 对二表进行关联)
compute by 子句 (统计)
select
* from tt order by sex
compute
sum(zongfeng),avg(zongfeng),max(zongfeng),min(zongfeng)
by
sex
上面是对TT表中的zongfeng字段按sex分类,分别进行求和,平均值,最大值,最小值进行统计
注意:在使用by子句时,需要先使用ORDER BY进行排序
select
top 10 percent * from tt --显示前百分之十的记录
使用变量
declare
@i int
set
@i=2
select
top (@i) * from tt
with
ties 子句(只有使用了order
by 子句才可以使用)
select
top 1 with ties * from tt order by sex—如果满足条件的最后一条记录有重复记录,那么重复的记录也将显示
基本的多表连接
select
b.name,a.shuxue,a.yuwen,a.zongfeng
from
tt a, info b
where
a.id=b.id
内连接(
全匹配,不匹配的不显示)
select
b.name,a.shuxue,a.yuwen,a.zongfeng
from
tt a join info b
on
a.id=b.id--后可以接where子句,条件放大on与放在where后面结果一样
where
a.zongfeng > 40
左外连接--左表为主表(
外连接分为左,右,全三种外连接,按主表匹配,
不匹配的补空)
select
b.name,a.shuxue,a.yuwen,a.zongfeng
from
tt a left join info b
on
a.id=b.id--后可以接where子句,条件放大on与放在where后面结果不同
where
a.zongfeng > 40
右外连接—右表为主表使用right outer join on(左外连接与右外连接只是主从表互换)
全连接 full outer join on
交叉连接(
返回二表中记录的秉积,功能与基本连接类似,cross
join)
自连接
联合查询(相当于将多个查询语句统一到一个查询语句中)
select
shuxue,yuwen,''
from
tt
where
sex='boy'
union
select
sum(shuxue),sum(yuwen),'总分'
from
tt
where
sex='boy'
子查询
select
a.name,b.zongfeng,b.sex
from
info a, tt b
where
a.id=b.id and a.zongfeng=(select MIN(zongfeng) from tt)
EXISTS关键字,判断查询的结果是否为真
declare
@username varchar(10)
declare
@pwd varchar(10)
set
@username='shen'
set
@pwd='boy'
if
exists(select * from tt a,info b where b.name=@username and a.sex=@pwd and a.id=b.id)
print'登录成功!'
else
print'登录失败'
交查询(查询二个查询语句中的交集 intersect ,第一个查询语句后不可以跟order by子句,第二个不用嵌套进行查询的话,将对整个查询语句进行排序)
select
a.zongfeng,a.sex,b.name,b.xuehao
from
tt a, info b
where
a.sex='girle' and a.id=b.id
intersect
select
c.zongfeng,c.sex,c.name,c.xuehao
from(
select
top 3 a.zongfeng,a.sex,b.name,b.xuehao
from
tt a, info b
where
a.id=b.id order by a.zongfeng desc
)c
差查询(先对第一个查询语句进行查询,在第一个查询结果的基础上再减去第二个查询语句与之相交的记录)
select
a.zongfeng,a.sex,b.name,b.xuehao
from
tt a, info b
where
a.sex='girle' and a.id=b.id
EXCEPT
select
c.zongfeng,c.sex,c.name,c.xuehao
from(
select
top 3 a.zongfeng,a.sex,b.name,b.xuehao
from
tt a, info b
where
a.id=b.id order by a.zongfeng desc
)c
XML查询
create
table xml_table
(
s_id
int,
s_data
xml
)
insert
into xml_table
values
(
1
,
'<学生信息><姓名>陈苗</姓名><性别>男</性别><班级>计算机应用班</班级></学生信息>'
)
select
* from xml_table
declare
@date xml
set
@date = (select s_data from xml_table where s_id=1)
select
@date.query('学生信息/姓名') 姓名
,@date.query('学生信息/性别') 性别,@date.query('学生信息/班级') 班级
FOR XML(将查询结果保存到表中,有四种模式,分别是RAW,AUTO,EXPLICIT,PATH)
select
a.zongfeng,a.sex,b.name,b.xuehao
from
tt a, info b
where
a.id=b.id
for
xml path
T-SQL中的逻辑运算符
ALL/ANY/AND/NOT/BETWEEN/SOME/LIKE/IN/EXISTS/OR
T-SQL中的基本运算符
+ / - / * / / / %
T-SQL中的注释
单选注释--这是单行注释
多行注释
/*
这里是多行注释的内容
*/
在嵌套语句中包含多条语句 可以使用
begin
end
将多条语句包括在其中
Case语句必须有一个变量来接受他的结果
declare
@one int
declare
@two varchar(20)
set
@one=3
select
@two = case @one
when 1
then '结果是'
when 2
then '结果是'
else
'不知道是什么'
end
print
@two
declare
@num int ,@i int
set
@i=1
set
@num=0
while (@i<100
)
begin
if
@i%2=1
begin
set @num=@num+@i
set @i=@i+1
print '@i='
print @i
print '@num='
print @num
continue
end
else
begin
if @i>10 break
set @i=@i+1
print @i
continue
end
end
print
@num
等待执行命令 WAITFOR
waitfor
delay '00:00:05'--跟间隙时间
print
'5秒后执行了'
waitfor
time '11:07:00' --跟具体时间
print
'11:07分执行的'
goto 跳转语句
declare
@i int
set
@i=1
while
@i<110
begin
if @i=1 goto one--跳转到指定标记
if @i>1 and @i<5 goto two
end
one:
print
'等于'
two:--定义一个标记
print
'大于小于'
goto
three
three:
print'下一次就要大于五了'
try catch 错误处理语句
declare
@i int
begin
try
set
@i=1/0
end
try
begin
catch
print
ERROR_LINE()
print
ERROR_MESSAGE()
print
'除数不可以为0'
end
catch
结果
3
遇到以零作除数错误。
除数不可以为0
数学函数
declare
@i float,@a int
set
@i=12.234
set
@a=100
select
round(@i,2)as 保留位小数,CEILING(@i)
as 大于@I的最小整数,
FLOOR(@i)as 小于@I的最大整数,SQUARE(@a)
as 平方
,SQRT(@a) as 开方,
POWER(@a,3) as 三次幂
字符串函数
declare
@str varchar(44)
set
@str='happy a life'
select
UPPER(@str) 变大写,
ASCII('a') 求ASCII,
CHAR(55)查看对应字符,
STR(10)+'12' 变字符,
REPLACE(@str,' a' ,' all') 替换,REPLICATE('a',5
)重复,
CHARINDEX('a',@str) 查找字符串起始位置
,PATINDEX('a%p',@str+'a') 使用通配符
聚合函数
AVG SUM MAX MIN COUNT
日期函数
SELECT
GETDATE() 现在日期,
YEAR(GETDATE())年
,month(GETDATE())月
,day(GETDATE())日,DATEADD(dd,30
,GETDATE())相差,
DATEDIFF(DD,GETDATE(),'2011-1-25')距离
元数据
declare
@a varchar(10)
set
@a='10'
print
Isnumeric(@a)--判断是否为数字
print
convert(int,@a*12)--强制类型转换
print
isnull(@a,'为空时返回的值')--是否为空值
标量值函数
CREATE
FUNCTION onefun(@a int) --定义函数
RETURNS
int--返回类型
AS
BEGIN
declare
@num int,@sum int
set @num=1
set @sum=0
while @num<@a
begin
set @num=@num+1
set @sum=@sum+@num
end
return @sum --返回值
END
GO
游标的操作
--创建游标
declare
one_cursor scroll cursor
for
select
* from tt
for
read only
open
one_cursor--打开游标
--检索游标
FIRST 第一行
LAST 最后行
PRIOR 前一行
NEXT 下一行 ABSOLUTE N 第N行RELATIVE N 当前行后N行
fetch
RELATIVE 2 from one_cursor
select
@@FETCH_STATUS --返回游标状态,成功-1失败-2行不存在
CLOSE
ONE_CURSOR--关闭游标
deallocate
one_cursor--释放游标
事务
事务模式:自动提交事务,显式事务(以BIGIN TRANSACTION 语句显式开始),隐式事务,批处理级事务
事务管理语句
BEGIN TRANSACTION 开始事务
COMMIT TRANSACTION 提交事务
ROLLBACK TRANSACTION 回滚事务
SAVE TRANSACTION 保存事务
begin
TRANSACTION
declare
@fight int
set
@fight=0
delete
from info where id=2
if
@fight = 0
begin
commit transaction --提交事务
end
else
rollback transaction --回滚事务
XACT_ABORT 选项 错误是否自动回滚
set xact_abort on
锁(封锁 LOCK 解锁 UNLOCK)
可封锁的单位有:行,页,表,盘区和数据库
锁的类型
共享(S)锁 用于读操作,多个事务共用
独占(X)锁,用于写操作,仅一个事务使用
更新(U)锁 用于对页施加X锁
死锁(两个或多个进程因争夺资源而造成互相等待的现象)
存储过程
create
procedure proc_1 --创建存储过程
@one
varchar(10) --设置参数,在此赋值可以设置默认值 @two varchar(10)=’boy’
as
select
* from tt where sex=@one
exec
proc_1 'boy' --调用存储过程
存储过程中的输出参数
create
procedure proc_1 --创建存储过程
@one
int, --设置参数
@two
int output --设置输出参数
as
select
@two=zongfeng from tt where id=@one
declare
@two int
exec
proc_1 'boy' ,@two output --调用存储过程,注意调用方式
select
@two
exec
sp_helptext proc_1 –查看存储过程内容
create
proc #show --创建临时存储过程
as
select * from info
create
proc #show --创建全局临时存储过程
as
select * from info
使用alter proc关键字修改存储过程
使用drop proc关键字删除存储过程