文章目录
- 一、基本介绍
- 1)基本数据类型
- 1.整形:int,smallint,tiny,bigint
- 2. 精度数值型:decimal,numeric
- 3. 浮点型:real,float
- 5.位型:bit
- 6.字符型、Unicode字符型和文本型:char/nchar,varchar/nvarchar,text/ntext
- 7.二进制型和图像型:binary [(n) ],varbinary [(n)],varbinary( MAX),Image
- 8.日期时间型:date,datetime,smalldatetime,datetime2,datetimeoffset,time
- 9.时间戳型:timestamp
- 10.平面和地理空间数据类型:geometry,geography
- 11.其他数据类型:sql_variant,uniqueidentifier,xml,hierarchyid
- 2)命令的基本介绍
- 二、实际操作
一、基本介绍
1)基本数据类型
数 据 类 型 | 符 号 标 识 |
---|---|
整数型 | int, smallint, tiny, bigint |
精确数值型 | decimal, numeric |
浮点型 | real,float |
货币型 | money, smallmoney |
位型 | Bit |
字符型Unicode字符型文本型 | char, varchar, varchar(MAX)nchar, nvarchar, nvarchar(MAX)text, ntext |
二进制型图像型 | binary[(n)], varbinary[(n)], varbinary(MAX)Image |
日期时间型 | date, datetime, smalldatetime, datetime2, datetimeoffset, time |
时间戳型 | timestamp |
平面和地理空间数据类型 | geometry, geography |
其他 | sql_variant, uniqueidentifier, xml, hierarchyid |
1.整形:int,smallint,tiny,bigint
类型 | 名称 | 数范围 | 精度 | 存储字节 |
---|---|---|---|---|
int | 整数 | -231~231-1 | 10 | 4 |
smallint | 短整数 | -215~215-1 | 5 | 2 |
tinyint | 微短整数 | 0~255 | 3 | 1 |
bigint | 大整数 | -263~263-1 | 19 | 8 |
2. 精度数值型:decimal,numeric
精确数值型数据由整数部分和小数部分构成,其所有的数字都是有效位,能够以完整的精度存储十进制数。decimal 和 numeric在功能上完全等价。
格式:numeric | decimal(p[,s]),其中p为精度,s为小数位数,s<p, 默认值为0。
存储–1038+1~1038–1的固定精度和小数位的数字数据。
3. 浮点型:real,float
浮点型不能精确表示数据的精度,用于处理取值范围非常大且对精确度要求不太高的数值量。
类型数范围 | 定义长度 | 精度 | 字节 |
---|---|---|---|
real –3.40E+38~3.40E+38 | 1~24 | 7 | 4 |
float –1.79E+308~1.79E+308 | 25~53 | 15 | 8 |
4. 货币型:money,smallmoney
用十进制数表示货币值。
类型 | 数范围 | 小数位数 | 精度 | 字节 |
---|---|---|---|---|
money | -263~263-1 | 4 | 19 | 8 |
smallmoney | -231~231-1 | 4 | 10 | 4 |
说明:
(1)当向表中插入money
或smallmoney
类型的值时,必须在数据前面加上货币表示符号($
),并且数据中间不能有逗号(,
);若货币值为负数,则需要在符号$的后面加上负号(-
)。例如,$15 000.32
,$680
,$-20 000.9088
都是正确的货币数据表示形式。
(2)money
的数范围与bigint
相同,不同的只是money
型有4位小数。smallmoney
与int
的关系就如同money
与bigint
的关系。
5.位型:bit
它只存储0和1。当为bit类型数据赋0时,其值为0,而赋非0时,其值为1。字符串值TRUE转换为1,FALSE转换为0。
6.字符型、Unicode字符型和文本型:char/nchar,varchar/nvarchar,text/ntext
字符型数据用于存储字符串,字符串中可包括字母、数字和其他特殊符号(如#、@、&等)。在输入字符串时,需将串中的符号用单引号或双引号括起来,如’abc’、“C语言”。
(1)char[(n)]
:定长字符数据类型,其中n定义字符型数据的长度,n在1~8000之间。默认n=1。若实际存储的串长度不足n时,则在串的尾部添加空格以达到长度n。若输入的字符个数超出了n,则超出的部分被截断。
(2)varchar[(n)]
:变长字符数据类型,n(1~8000)表示的是字符串可达到的最大长度。实际长度为输入字符串的实际字符个数,而不一定是n。当列中的字符数据值长度接近一致时,如姓名,此时可使用char
;当列中的数据值长度显著不同时,使用varchar较为恰当,可以节省存储空间。
(3)text
:可以表示最大长度为2311个字符,其数据的存储长度为实际字符个数。
nchar(n)
、nvarchar(n)
、ntext
使用UNICODE UCS-2字符集,该字符集1个字符用2个字节表示,n=1~4000,占用2n字节空间。
(4)varchar(MAX)
、nvarchar(MAX)
:最多可存放231-1个字节的数据,可以用来替换text、ntext数据类型。
7.二进制型和图像型:binary [(n) ],varbinary [(n)],varbinary( MAX),Image
二进制数据类型表示的是位数据流,包括binary(固定长度)和varbinary(可变长度)两种。
(1)binary [(n) ]
:固定长度的n个字节二进制数据。n的取值范围为1~8000,默认为1。binary(n)
数据的存储长度为n+4个字节。若输入的数据长度小于n,则不足部分用0填充;若输入的数据长度大于n,则多余部分被截断。
(2)varbinary [(n)]
:n个字节变长二进制数据。
(3)image(图像数据型):用于存储图片、照片等。实际存储的是可变长度二进制数据,介于 0与231-1字节之间。该类型是为了向下兼容而保留的数据类型。
(4)varbinary(MAX)
:最多可存放231-1个字节的数据,推荐用户使用varbinary(MAX)
数据类型来替代image类型。
8.日期时间型:date,datetime,smalldatetime,datetime2,datetimeoffset,time
日期时间类型数据用于存储日期和时间信息,用户以字符串形式输入日期时间类型数据,系统也以字符串形式输出日期时间类型数据。
数据类型 | 日期范围 | 精确度 | 说明 |
---|---|---|---|
date | 1.1.1~9999.12.31 | 日期 | |
datetime | 1753.1.1~9999.12.31 | 3.33ms | 日期和时间分别给出 |
smalldatetime | 1900.1.1~2079.6.6 | 分 | 日期和时间分别给出 |
datetime2 | 1.1.1~9999.12.31 | hh:mm:ss[.nnnnnnn] | datetime(n)表示n(=1~7)位微秒 |
datetimeoffset | YYYY-MM-DD | hh:mm:ss[.nnnnnnn] | [{+|-}hh:mm 带时区偏移量 |
time | hh:mm:ss[.nnnnnnn] | time(n)表示n(=1~7)位微秒 |
(1) 日期部分的表示形式常用的格式如下:
年 月 日 | 2001 Jan 20、2001 January 20 |
---|---|
年 日 月 | 2001 20 Jan |
月 日[,]年 | Jan 20 2001、Jan 20,2001、Jan 20,01 |
月 年 日 | Jan 2001 20 |
日 月[,]年 | 20 Jan 2001、20 Jan,2001 |
日 年 月 | 20 2001 Jan |
年(4位数) | 2001表示2001年1月1日 |
年月日 | 20010120、010120 |
月/日/年 | 01/20/01、1/20/01、01/20/2001、1/20/2001 |
月-日-年 | 01-20-01、1-20-01、01-20-2001、1-20-2001 |
月.日.年 | 01.20.01、1.20.01、01.20.2001、1.20.2001 |
(2)时间部分常用的表示格式如下:
时:分 | 10:20、08:05 |
---|---|
时:分:秒 | 20:15:18、20:15:18.2 |
时:分:秒:毫秒 | 20:15:18:200 |
时:分AM|PM | 10:10AM、10:10PM |
9.时间戳型:timestamp
该类型反映系统对该记录修改的相对(相对于其他记录)顺序,它实际上是二进制格式数据,其长度为8字节。每当对该表加入新行或修改已有行时,都由系统自动将一个计数器值加到该列,即将原来的时间戳值加上一个增量。一个表只能有一个timestamp 列。
10.平面和地理空间数据类型:geometry,geography
(1)geometry(平面空间数据类型):它作为.NET公共语言运行时(CLR)数据类型实现,表示欧几里得(平面)坐标系中的数据。
(2)geography(地理空间数据类型):它作为.NET 公共语言运行时(CLR)数据类型实现,表示圆形地球坐标系中的数据。 SQL Server支持geography 数据类型用于存储GPS纬度和经度坐标之类的椭球体(圆形地球)数据。
11.其他数据类型:sql_variant,uniqueidentifier,xml,hierarchyid
(1)sql_variant
:一种存储SQL Server支持的各种数据类型(除text
、ntext
、image
、timestamp
和sql_variant
外)值的数据类型。sql_variant
的最大长度可达8016字节。
(2)uniqueidentifier
:唯一标识符类型。系统将为这种类型的数据产生唯一标识值,它是一个16字节长的二进制数据。
(3)xml
:用来在数据库中保存xml文档和片段的一种类型,但是此种类型的文件大小不能超过2 GB。
(4)hierarchyid
:可表示层次结构中的位置。
2)命令的基本介绍
1.创建表的命令
创建表命令的主要格式如下:
CREATE TABLE 表名
(
{ <列定义> | <计算列定义> | <列集>}
[ <表约束> ] [ ,...n ]
)
[ ; ]
说明:
(1)表名的完整写法是:[ 数据库名.[架构名]. | 架构名. ] 表名,但前面部分一般不写。
(2)创建表包括定义表和定义组成表的各列。<表约束>用于保证表中数据完整性。
列的定义
<列定义> ::=
列名 <数据类型> /*指定列名、列的数据类型*/
[ NULL | NOT NULL ] /*指定是否为空*/
[
[ CONSTRAINT 约束名 ]
DEFAULT常量表达式 /*指定默认值*/
]
| [ IDENTITY [ (初值, 增量) ] /*指定列为标识列*/
[ ROWGUIDCOL ] /*指定列为全局标识符列*/
[ <列约束> … ] /*指定列的约束*/
<数据类型> ::=
类型名 [ ( 精度 [ , 小数位 ] | max ]
说明:
(1)NULL | NOT NULL
:NULL
表示列可取空值,NOT NULL
表示列不可取空值。
(2)DEFAULT
常量表达式:为所在列指定默认值,默认值“常量表达式”必须是一个常量值、标量函数或NULL
值。
(3)IDENTITY
:指出该列为标识符列,为该列提供一个唯一的、递增的值。“初值”是标识字段的起始值,默认值为1,“增量”是标识增量,默认值为1。
(4)ROWGUIDCOL
:表示列是行的全局唯一标识符列,ROWGUIDCOL
属性只能指派给uniqueidentifier
列。
(5)<列约束>
:列的完整性约束。指定该列为主键则使用PRIMARY KEY
关键字。
计算列
计算列中的值是通过其他列计算出来的,该列实际并不存放值。
<计算列定义> ::=
列名 AS 计算列表达式
[ PERSISTED [ NOT NULL ] ]
2.修改表结构的命令
修改表结构语法格式如下:
ALTER TABLE 表名
{
ALTER COLUMN 列名{, …} /*修改列属性*/
| ADD /*添加列*/
{
<列的定义>
} [ , ... ] <表约束>
| DROP /*删除列*/
{
[ CONSTRAINT ] 约束名 /*删除约束*/
| COLUMN 列名
} [ , ... ]
}
1)命令主体
ALTER TABLE命令主体结构说明如下:
(1)表名
:要修改的表名。
(2)ALTER COLUMN子句
:修改表中指定列的属性,“列名”给出要修改的列。
若表中该列所存数据的数据类型与将要修改的列类型冲突,则发生错误。例如,原来char类型的列要修改成int类型,而原列值包含非数字字符,则无法修改。
(3)ADD
子句:向表中增加新列,新列的定义方法与CREATE TABLE命令中定义列的方法相同。一次还可以添加多个列,中间用逗号隔开。
(4)DROP
子句:从表中删除列或约束。
(5)WITH
子句:[ WITH { CHECK | NOCHECK } ]指定表中的数据是否用新添加的或重新启用的FOREIGN KEY
或CHECK
约束进行验证。ALL关键字指定启用或禁用所有约束。
2)ALTER COLUMN子句
该语句格式为:
ALTER COLUMN 列名
{
类型名 [ ( 精度[ , 小位数] ) ]
[ COLLATE排序名 ]
[ NULL | NOT NULL ]
……
}
(1)类型名:为被修改列的新的数据类型。当要修改成数值类型时,可以使用“( 精度[ , 位数] )”分别指定数值的精度和小数位数。
(2)[NULL | NOT NULL]:表示将列设置为是否可为空,设置成NOT NULL时要注意表中该列是否有空数据。
3.表的删除
语法格式:
DROP TABLE 表名 [ , ... ]
二、实际操作
1)表的创建
创建一下表:
Major(mno ,mname) 表示专业号,专业名
Stu(sno,sname,gender,birdate,mno,memo,photo)分别表示学号,姓名,性别,出生年月有,所在的专业号,简介,相片
Cou(cno,cname,credit,ptime)表示课号,课名,学分,学时
Sc(sno,cno,grade)
stu_credit(no,sno,totalcredit),分别表示记录号,学号及当前已修学分。其中记录号为int类型,且按步长1自动增长
Major表
create table major
(
mno varchar(10) not null primary key,
mname nvarchar(20) not null
)
Stu表
create table stu
(
sno varchar(20) not null primary key,
sname nvarchar(20) not null,
gender nvarchar(10) not null check(gender='男'or gender='女'),
birdate date ,
mno varchar(10) not null foreign key (mno) references major(mno),
memo nvarchar(200) default null,
photo varchar(50) not null
)
cou表
create table cou
(
cno varchar(10) not null primary key,
cname nvarchar(20) not null,
credit int ,
ptime int default 0
)
sc表
create table sc
(
sno varchar(20) not null ,
cno varchar(10) not null,
grade int default 0
foreign key (sno) references stu(sno),
foreign key (cno) references cou(cno),
)
stu_credit表
identity(n,m)
表示自动增长,从n开始,每次增加m
create table stu_credit
(
no int not null primary key identity(1,1),
sno varchar(20) not null ,
totalcredit int default 0
)
2)表的修改
1.增加字段
为stu
表添加email
字段
alter table stu add email varchar(20)
为stu
表添加qq
字段
alter table stu add qq char(10)
2.增加约束
为stu
表的email
字段添加check
约束
alter table stu add constraint email_check check(email like '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$')
为cou
表的credit
添加default
约束
alter table cou add constraint credit_default default 0 for credit
3.删除字段
删除stu
表的qq
字段
alter table stu drop column qq
3)表的删除
删除stu_credit
表
drop table stu_credit
4)利用SSMS导出表间关系图
右击数据库关系图,选择新建数据库关系图
选择所要关联的表
5)完整的脚本
create table major
(
mno varchar(10) not null primary key,
mname nvarchar(20) not null
)
create table stu
(
sno varchar(20) not null primary key,
sname nvarchar(20) not null,
gender nvarchar(10) not null check(gender='男'or gender='女'),
birdate date ,
mno varchar(10) not null foreign key (mno) references major(mno),
memo nvarchar(200) default null,
photo varchar(50) not null
)
alter table stu add email varchar(20)
alter table stu add constraint email_check check(email like '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$')
alter table stu add qq char(10)
alter table stu drop column qq
create table cou
(
cno varchar(10) not null primary key,
cname nvarchar(20) not null,
credit int ,
ptime int default 0
)
--增加default约束
alter table cou add constraint credit_default default 0 for credit
create table sc
(
sno varchar(20) not null ,
cno varchar(10) not null,
grade int default 0
foreign key (sno) references stu(sno),
foreign key (cno) references cou(cno),
)
create table stu_credit
(
no int not null primary key identity(1,1),
sno varchar(20) not null ,
totalcredit int default 0
)
drop table stu_credit