一.DDL(data define language)
1.create database:
create database test
on
(
name=test_dat,
filename='c:\test.mdf',
size=5MB,
maxsize=25MB,
filegrowth=5MB
)
log on
(
name=test_log,
filename='c:\test.log',
size=5MB,
maxsize=10MB,
filegrowth=5%
)
2.alter datebase:
下例创建数据库,并更改该数据库以添加一个 5 MB 大小的新数据文件。
USE master
GO
CREATE DATABASE Test1 ON
(
NAME = Test1dat1,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat1.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
GO
ALTER DATABASE Test1
ADD FILE
(
NAME = Test1dat2,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat2.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
GO
下例在示例 A 中所创建的 Test1 数据库中创建一个文件组,并将两个 5 MB 的文件添加到该文件组。然后下例将 Test1FG1 设置为默认文件组。
USE master
GO
ALTER DATABASE Test1
ADD FILEGROUP Test1FG1
GO
ALTER DATABASE Test1
ADD FILE
( NAME = test1dat3,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat3.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB),
( NAME = test1dat4,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat4.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)
TO FILEGROUP Test1FG1
ALTER DATABASE Test1
MODIFY FILEGROUP Test1FG1 DEFAULT
GO
下例向数据库中添加两个 5 MB 大小的日志文件。
USE master
GO
ALTER DATABASE Test1
ADD LOG FILE
( NAME = test1log2,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\test2log.ldf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB),
( NAME = test1log3,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\test3log.ldf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)
GO
下例将示例 B 中添加到数据库 Test1 中的一个文件删除。
USE master
GO
ALTER DATABASE Test1
REMOVE FILE test1dat4
GO
下例将示例 B 中添加到数据库 Test1 中的一个文件增加大小。
USE master
GO
ALTER DATABASE Test1
MODIFY FILE
(NAME = test1dat3,
SIZE = 20MB)
GO
假定原来另一个文件组设置为默认文件组,下例将主文件组设置为默认文件组。
USE master
GO
ALTER DATABASE MyDatabase
MODIFY FILEGROUP [PRIMARY] DEFAULT
GO
3.drop database:
drop database test1,test2
4.create table:
create table test
(
id int primary key not null,
name nvarchar(30),
sex bit,
describ nvarchar(500)
)
5.alter table:
alter table test
add column sys_instime datetime,
drop column sys_instime
alter column sys_instime year
6.drop table:
drop table test
7.truncate table:删除表中的数据连同日志,即如果使用id为自增长,则删除之后id将从0开始
truncate table test
8.create index:(事先排序,如字典中的索引)
唯一索引:create unique index i_name
on test(name desc,sex)
聚集索引:create clustered index i_name on test(name)
非聚集索引:create nonclustered index i_name on test(name)
复合索引:create index i_nameage on test(name,age)
9.drop index:
drop index test.i_name
二.DML(data manage language)
select:
where子句通配符:like '%a' "%a%" '_a' '[ab]%'(以ab开头的) '[^ab]'(不以ab开头的)
top:
select top 1 * from test;
select top 50 percent * from test;
in:
select * from test where age in(1,2)(年龄在一,2之间)
not in :一样用法
多表查询:
1.直接引用两个表:select * from test a,test1 b where a.cid=b.cid
2.join:select * from test a inner join test1 b on b.cid=a.cid
full join 左右两个表的所有记录以及他们的匹配情况。
3.union:合并查询结果集,distinct相同记录
union all:不 distinct相同记录
数据导入和备份:
1.select * into test_bak from test (单表导入)
select a.name,b.age into test_bak from test a inner join test1 b on b.pid=a.pid ;或者(where a.pid=b.pid)(多表导入)
同时也可以指定导入到其他数据库:select * into test_bak in test3.mdf from test
2.insert into test_bak select * from test
3.从其他表中导入数据更新现有数据:
update test a set a.remark=b.remark from test1 b where a.cid=b.cid
4.函数:
sqlserver 内建日期函数:
getdate():
datepart():d=datepart(qq,getdate())(季度),datepart(dy,getdate())一年中第几天,
datepart(ww,getdate())(第几周),datepart(dw,getdate())一周中第几天,
年 | yy, yyyy |
季度 | qq, q |
月 | mm, m |
年中的日 | dy, y |
日 | dd, d |
周 | wk, ww |
星期 | dw, w |
小时 | hh |
分钟 | mi, n |
秒 | ss, s |
毫秒 | ms |
微妙 | mcs |
纳秒 | ns |
年 | yy, yyyy |
季度 | qq, q |
月 | mm, m |
年中的日 | dy, y |
日 | dd, d |
周 | wk, ww |
星期 | dw, w |
小时 | hh |
分钟 | mi, n |
秒 | ss, s |
毫秒 | ms |
微妙 | mcs |
纳秒 | ns |
dateadd:在日期中加减。
select dateadd(yy,-2,getdate())
datediff():返回两个日期之间相差的年数,月数,日数,由datepart参数决定
select datediff(mm,'2010-1-1','2010-2-1')
convert().
select convert(nvarchar(30),getdate(),23)
year:
select year/month/day(getdate())
Sql null:
select isnull(name,'') from test
cast:
cast(name as nvarchar(30))
exp:求e的n次方
EXP(0)
log:求对数
log10:求底为10对数
square:求平方
sqrt:求平方根
STR:SQRT可以将数值型转换为字符型资料,允许控制小数的格式。
语法:STR(float_expression[,length[,decimal]])
变量:length:想要的字符串的总长度。缺省为10。
decimal:是小数点右边的位数。四舍五入。如果不写长度则为取整,小数后四
舍五入。
left:从左边取多少位
left(name,3)从左起取三个。
right:从右边取多少位
right(name,3)
REVERSE:REVERSE返回字符串表达式的倒序。
语法:REVERSE(character_expression)
例如:REVERSE(‘PAM’)结果为‘MAP’
LTRIM:LTRIM删除字符表的前导空格。
语法:LTRIM(character_expression)
变量是字符表达式。
RTRIM:RTRIM删除字符表的后继空格。
语法:RTRIM(character_expression)
变量是字符表达式。
NULLIF:如果一对表达式相等,NULLIF函数就返回NULL,如果它们不相等,NULLIF函数就返回第一个表达式的值。
语法:NULLIF(expression1,expression2)
变量:expression可以数值型,也可以是字符串。
例如:SELECT NULLIF(134,135)返回值为134。
PI:PI函数返回pi的值3。1415926
REPLACE:REPLACE用串表达式3取代串表达式1中的表达式2。
语法:REPLACE(‘string1’,‘string2’,‘string3’)
例如:SELECT REPLACE(‘mydog’,‘dog’,‘car’)
STUFF:替换指定位置的字符。
语法:STUFF(character_expression,start,length,character_expression)
例如:select stuff('abcdefg',5,1,'1')
substring:返回指定位置的字符。从第五个开始,去一个,即结果为e,取两个的话,结果为ef
例如:select substring('abcdefg',5,1)
replicate:重复字符串个数
如:select replicate('a',5)
char(n) | 固定长度的字符串。最多 8,000 个字符。 | n |
varchar(n) | 可变长度的字符串。最多 8,000 个字符。 | |
varchar(max) | 可变长度的字符串。最多 1,073,741,824 个字符。 | |
text | 可变长度的字符串。最多 2GB 字符数据。 |
nchar(n) | 固定长度的 Unicode 数据。最多 4,000 个字符。 | |
nvarchar(n) | 可变长度的 Unicode 数据。最多 4,000 个字符。 | |
nvarchar(max) | 可变长度的 Unicode 数据。最多 536,870,912 个字符。 | |
ntext | 可变长度的 Unicode 数据。最多 2GB 字符数据。 |
bit | 允许 0、1 或 NULL | |
binary(n) | 固定长度的二进制数据。最多 8,000 字节。 | |
varbinary(n) | 可变长度的二进制数据。最多 8,000 字节。 | |
varbinary(max) | 可变长度的二进制数据。最多 2GB 字节。 | |
image | 可变长度的二进制数据。最多 2GB。 |
tinyint | 允许从 0 到 255 的所有数字。 | 1 字节 |
smallint | 允许从 -32,768 到 32,767 的所有数字。 | 2 字节 |
int | 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 | 4 字节 |
bigint | 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。 | 8 字节 |
decimal(p,s) | 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 |
5-17 字节 |
numeric(p,s) | 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 |
5-17 字节 |
smallmoney | 介于 -214,748.3648 和 214,748.3647 之间的货币数据。 | 4 字节 |
money | 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。 | 8 字节 |
float(n) | 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 | 4 或 8 字节 |
real | 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 | 4 字节 |
datetime | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 | 8 bytes |
datetime2 | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 | 6-8 bytes |
smalldatetime | 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 | 4 bytes |
date | 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 | 3 bytes |
time | 仅存储时间。精度为 100 纳秒。 | 3-5 bytes |
datetimeoffset | 与 datetime2 相同,外加时区偏移。 | 8-10 bytes |
timestamp | 存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。 |
sql_variant | 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。 |
uniqueidentifier | 存储全局标识符 (GUID)。 |
xml | 存储 XML 格式化数据。最多 2GB。 |
cursor | 存储对用于数据库操作的指针的引用。 |
table | 存储结果集,供稍后处理。 |
合计函数:
where 不能与合计函数一起使用,所以引入having:
select name,sum(age) from test group by name having sum(age)=14
lower()小写,upper()大写,substring(column,start,length),len()取长度,round(column,保留位数)四舍五入函数
三.高级应用:
存储过程:begin ,end相当于花括号而已
例3、create procedure goods_ordersum
@goodsname varchar(20),//输入参数
@ordersum money output//输出参数
as
sql_statements
例4、create procedure goods_order2//默认值
@goodsname varchar(20)=null
as
sql_statements
触发器:
限制:1、在调用CREATE TRIGGER语句时,它必须为批中的第一个语句。
2、 触发器的基表不能为视图。
3、 WRITETEXT语句和TRUNCATE TABLE语句对触发表的资料操作不能激活触发器。
4、 由于触发器的主要用是检查和修改资料,所以在触发器不要使用能够返回结果集合的要SELECT语句和变量赋值语句。如果确实需要在触发器对变量赋值,应在触发器定义开始部分使用SET NOCOUNT语句禁止SQL SERVER返回结果集合。
例如:
create trigger tr_test on test
for insert,delete,update
as
set nocount on
update test set age=2
函数:只返回一个结果集
如:create function dbo.getname()
(
id as int
)
returns nvarchar(4000)
as
begin
sql_statements
end
游标:对表中的指定列进行操作
DECLARE _cursor CURSOR SCROLL FOR --定义游标,并让其指向查询出来的记录
SELECT subname FROM bzk_school_position a,bzk_school_sp b
where b.school_per_cid=@cid and b.position_cid=a.cid
OPEN _cursor--打开游标
FETCH NEXT FROM _cursor INTO @subname--把游标指向的第一个记录赋给中间变量
WHILE @@FETCH_STATUS = 0--当游标指向不为空的时候,循环
BEGIN
set @result=@result+@subname+'、'--把每次循环的值依次累加给返回变量
FETCH NEXT FROM _cursor INTO @subname --游标指向下一个记录
END
CLOSE _cursor--关闭游标
DEALLOCATE _cursor--释放游标
系统存储过程:sp_tables/columns 查sql帮助
事务处理:
begin tran//开始事务处理
declare @error1 int //设置变量接收异常
set @error1=0 //初始化为0
delete...
set @error=@@error+@error1 //累加异常
delete...
set @error=@@error+@error1 //累加异常
if @error<>0 //如果有异常 回滚
rollback tran
else
commit tran //否则提交
go