本文整理自《数据库原理与应用教程 / 何玉洁编著 . —4 版》
SQL Server 数据定义
注意,SQL语言是不区分大小写的,本人所有语句统一用小写表示,且讲解语句格式时中括号表示可省略。
数据类型
数值类型
整数类型
数据类型 | 范围及参数说明 |
---|---|
bigint | 存储 -263到263-1的整数 |
int | 存储 -231到231-1的整数 |
smallint | 存储 -215到215-1的整数 |
tinyint | 存储0到255之间的整数 |
bit | 存储1、0或 NULL |
精确小数类型
数据类型 | 范围及参数说明 |
---|---|
decimal(p,s) 或 numeric(p,s) | 可不传入参数或只传入参数p,p表示最多存储小数点左右两边的合计位数,范围为1到38,默认18,s为小数位数,范围为0到p,默认为0,p-s 确认小数点左边最大位数 |
浮点数类型
数据类型 | 范围及参数说明 |
---|---|
float(n) | n表示浮点数的尾数(去掉小数点后整数的精度)若传入1到24的整数将n视为24,若传入25到53的整数或不传入参数将n视为53,范围为-1.79E+308到-2.23E-308,0,2.23E-308到1.79E+308 |
real | 相当于 float(24),范围为-3.40E+38到-1.18E-38,0,1.18E-38,3.40E+38 |
字符串类型
注意:SQL 中字符串常量要用单引号括起来
非 Unicode 字符串类型
数据类型 | 范围及参数说明 |
---|---|
char(n) | 固定长度,n用于定义字符串长度,范围为1到8000,默认为1 |
varchar(n) | 可变长度,n用于定义字符串长度,范围为1到8000,默认为1,或传入参数max指示最大存储大小为231-1字节(2GB) |
text | 可变长度,可存储 231-1 个字符,可以用 varchar(max) 代替 |
Unicode 字符串类型
数据类型 | 范围及参数说明 |
---|---|
nchar(n) | 固定长度,n用于定义字符串长度,范围为1到4000,默认为1 |
nvarchar(n) | 可变长度,n用于定义字符串长度,范围为1到4000,默认为1,或传入参数max指示最大存储大小为231-1字节(2GB) |
ntext | 可变长度,可存储 230-1 个字符,可以用 nvarchar(max) 代替 |
二进制字符串类型
数据类型 | 范围及参数说明 |
---|---|
binary(n) | 固定长度,n用于定义二进制数据占用字节数,范围为1到8000,默认为1 |
varbinary(n) | 可变长度,n用于定义二进制数据占用字节数(实际占用字节数会+2),范围为1到8000,默认为1,或传入参数max指示最大存储大小为231-1字节(2GB) |
image | 可变长度,可存储 231-1 个字节长度的二进制数据,可以用 varbinary(max) 代替 |
日期和时间类型
注意:SQL 中日期和时间类型的数据常量要用单引号括起来,且时间都为24小时制
数据类型 | 范围及参数说明 |
---|---|
datetime | 定义一个日期和时间组合的类型,格式为 ‘YYYY-MM-DD hh:mm:ss.n*’ ,n*范围为0到999,表示秒的小数部分。日期范围为1753-1-1到9999-12-31,时间范围为00:00:00到23:59:59.997 |
smalldatetime | 格式为 ‘YYYY-MM-DD hh:mm:00’,其中秒始终0,且不带秒的小数部分,日期范围变为1900-01-01到2079-06-06 |
date | 定义一个日期,格式为 ‘YYYY-MM-DD’,范围为0001-01-01到9999-12-31 |
time | 定义一个时间,格式为 ‘hh:mm:ss[.n*]’,其中 n* 范围为0到9 999 999,表示秒的小数部分,时间范围为 00:00:00.0000000到23:59:59.9999999 |
datetime2 | 定义一个日期和时间结合的类型,格式为 ‘YYYY-MM-DD hh:mm:ss[.n*]’,精度和范围同 date 和 time 类型,但 n* 精度可变,默认精度为7位数 |
datetimeoffset | 定义包含所在时区的日期时间类型,格式为 ‘YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+或-}hh:mm]’,最后可附加的 hh 范围为-14到+14,mm 范围为00到59 |
数据定义
create 语句定义基本表
create table 语句可以实现定义基本表,其基本格式如下:
create table <表名> (
<列名> <数据类型> [列级完整性约束定义]
{, <列名> <数据类型> [列级完整性约束定义] ... }
[, 表级完整性约束定义] )
其中表名的首字母一般大写表示,列名一般所有字母都用小写表示。
此外,其中有两种可选的完整性约束语句,用于限制表内各列的数据格式和范围,其中列名完整性约束只能写一个,如果某一列有多个约束,必须将部分约束写在表级完整性约束内。
注意,每两行语句间必须有逗号隔开。
约束定义语句
constraint 语句可以用来定义约束名,后可跟具体的约束内容语句(也可以不定义约束名,直接写约束)。
[constraint 约束名] 约束语句
语句 | 作用 |
---|---|
not null | 限制列取值非空 |
default | 指定列的默认值 |
unique | 限制列取值不能重复 |
check | 限制列的取值范围 |
primary key | 定义主码 |
foreign key | 定义外码 |
各语句详细介绍:
- not null
只能在列级完整性约束定义处定义,不需要加参数。
id char(10) not null
- default
只能在列级完整性约束定义处定义,后跟要定义的默认值内容。
id char(10) default '1234567890'
- unique
可以定义多个 unique 约束,也可以在一个语句内定义多个列的约束。
-- 列级
id char(10) unique
-- 表级
constraint u_c unique (id,name)
- check
注意约束内容必须写在括号内,如果存在不同列之间的约束,则 check 语句只能写在表级完整性约束定义内。
-- 列级
score int check (score>=0 and score<=100)
-- 表级
constraint c_c check (scoreA < scoreB)
- primary key
注意,一个表内只能存在一个 primary key 语句,但是该语句可以定义多个列为主键。(即主键只有一个,但是可以由多个列组成联合主键)
-- 列级
id char(10) primary key
-- 表级
constraint pk_c primary key (id,name)
- foreign key references
列级完整性约束定义中,foreign key (列名) 部分可以不写,只写 references 语句。
-- 基本格式
[constraint 约束名] [foreign key (列名)] references 表名 (列名)
-- 列级
id char(10) references Student (id)
-- 表级
constraint fk_c foreign key (id) references Student (id)
drop、add、alter 语句
alter 语句可以用来修改表或列的结构,drop 语句可以用来删除表或列或约束,add 语句可以用来添加列或约束,具体用法如下
-- 删除表
drop table <表名>
--修改列定义
alter table <表名>
alter column <列名> <新数据类型>
-- 添加新列
alter table <表名>
add <列名> <数据类型> <约束>
-- 删除列
alter table <表名>
drop column <列名>
-- 添加约束
alter table <表名>
add [constraint <约束名>] 约束定义
-- 删除约束
alter table <表名>
drop [constraint] <约束名>