第4章-SQLServer数据库的表管理
一、表的基本概念
Ø表是包含数据库中所有数据的数据对象,表定义是一列集合
Ø数据在表中的组织方式与在电子表格中相似,都是按行和列的格式组织的
Ø每一行代表一条唯一记录,每一列代表记录中的一个字段
(1)、数据完整性
数据完整性是指数据的精确性和可靠性,它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入/输出造成无效操作或错误信息而提出的
1、实体完整性
Ø实体完整性将行定义为特定表的唯一实体
Ø实体完整性通过unque(唯一)索引,unque约束或Primary key(主键)约束,强制表的标识符列或主键的完整性
2、域完整性
Ø域完整性指特定列的有效性
Ø可以强制域完整性限制类型(通过使用数据类型)、限制格式(通过使用check约束和规则)或限制可能值的范围(通过使用foreign key约束、check约束、Default定义、Not Null定义和规则)
3、引用完整性
Ø输入或删除行时,引用完整性保留表之间定义的关系
Ø引用完整性通过foreign key(外键)和check(检查)约束,以外键与主键之间或外键与唯一键之间的关系为基础
Ø引用完整性确保键值在所有表中一致
4、用户定义完整性
Ø用户定义完整性命名您可以定义不属于其他任何完整性类别的特定业务规则,所有完整性类别都支持用户定义完整性
(2)、主键
Ø主键唯一标识表中的行数据,一个主键值对应一行数据
Ø主键由一个或多个字符段组成,其值具有唯一性,不允许取空值(Null),一个表只能有一个主键
Ø如果主键由多个列组成,则其中一列将允许重复值,但是主键中所有列的值各种组合必须是唯一的
二、使用SSMS操作数据表
ØSQL Server中的每个数据库最多可以存储20亿个表,每个表可以有1024列
Ø表的行数据及总大小仅受可用存储空间的限制,每行最多可以存储8060字节
(1)、数据类型
Ø数据类型是数据的一种属性,用于指定对象可保存的数据的类型,如整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等
Ø数据类型类别:“精准数字、近似数字、日期和时间、字符串、unicode字符串、二进制字符串、其他数据类型”
【精准数字】
int:整数数据类型,几乎所有数值型的数据都可以使用这种数据类型,可以存储c 从-(-2147483648)到(2147483648)之间的整数,它占用了4个字节的空间。
bigint:存储数据值超过int数据类型支持范围,可以存储-到之间的数值,它点用了8个字节的空间
smallint:存储一些常限定在特定范围内的数值类型数据,可以存储从-(-32768)到(32768)之间的整数,它占用了1个字节的空间
tinyint:在存储有限数目的数值时很有用,存储从0到255之间的数值,它占用1个字节的空间
bit:整型数据,其值只能是0、1或Null(空值)。它只能存储只有两种可能值的数据,如“yes或no”,“Falce或on、off”
decimal:小数,用来存储从-到-1的固定精度和范围的数值型数据。使用它必须指定范围和精度。‘范围’是小数据点左右所能存储的数字的总位数。‘精度’是小数点右边存储的数字的位数
numeric:numeric在功能上等介于decimal
money:用来表示钱和货币值。精确到货币单位的万分之一。它占用了8个字节空间,从-922337203685477.5808到922337203685477.5807之间
sumallmoney:smallmoney在功能上等价于money。从-214748.3648到214748.3647之间
【近似数字】
float:用于表示浮点数值数据的大致数值数据类型。浮点数据为近似值,因此,并非数据类型范围内的所有数值都能精确地表示。表示值在-1.79E+308到1.79E+308之间的任意数
real:用于表示浮点数值数据的大致数值数据类型。表示值在-3.40E+38到3.40E+38之间的浮点数
【日期和时间】
date:用来表示日期。它占用了3个字节空间,存储从公元元年1月1日到公元9999年12月31日间所有的日期数据
time:用来表示一天中的某个时间。它占用了5个字节空间
datetime:用来表示日期和时间。它占用了8个字节空间。存储从1753年1月1日到9999年12月31日间所有的日期和时间数据
datetime2:可将datetime2视作现有datetime类型的扩展。其数据范围更大,默认的小数精度更高
datetime offset:用来表示日期和时间。与datetime2相比,增加了时区
smalldatetime:用来表示从1900年1月1日到2079年6月6日的日期和时间,精确到一分钟,该数据类型占用了4个字节空间
【字符串】
char:用于存储固定长度,非Unicode(统一,全球通用)字符数据。它包含了8000个字符
varchar:用于存储可变长度,非Unicode字符数据。它包含了-1或大约20亿个字符
text:用于存储大量的非Unicode字符型数据。包含-1或大约20亿个字符
【Unicode字符串】
nachar:用于存储定长Unicode字符型数据。Unicode用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。该数据类型使用的字节在空间上增加了一倍。
nvarchar:用于存储变长Unicode字符型数据。该数据类型使用的字节在空间上增加了一倍
ntext:用于存储大量的Unicode 字符型数据。该数据类型使用的字节在空间上增加一倍
【二进制字符串】
binary:可存8000字节长的定长二进制数据。当输入表的内容接近相同的长度时,应该使用这种数据类型
varbinary:可存8000字节长的变长的二进制数据。当输入表的内容大小可变时,应该使用这种类型数据
image:用于存储变长的二进制数据,最大可达-1或大约20亿字节
(2)、默认值
Ø如果插入行时没有为列指定值,默认值则指定列中使用什么值
Ø默认值可以是计算结果为常量的任何值
(3)、标识符列
Ø对于每个表,均可创建一个包含系统生成的序号值的标识符列,该序号值以唯一方式标识表中的每一行
Ø可以使用标识符列在表中创建自动递增标识号,所以标识符列习惯上又叫自增列,只能为每个表创建一个标识符列
【标识符列的特点】
a)列的数据类型为不带小数的数值类型
b)在进行插入(insert)操作时,该列的值由系统按一定规律生成,不允许为空值
c)列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列
【标识列的指定内容】
a)类型(type):标识符列类型必须是数值类型,如decimal、int、bignit、tiynyint、smallint、numeric。当选择decimal和numeric时,小数位数必须为0
b)种子(Seed):指派给表中第一行的值,默认为1
c)递增量(increment):想邻两个标识值之间的增量,默认值为1
(4)、检查约束
Ø通过限制列可接受的值,CHECK约束可以强制域的完整性
Ø可以通过任何基于逻辑运算符返回TRUE或FALSE的逻辑(布尔)表达式,创建CHECK约束
Ø例如:限制从0-200之间的年龄数值
age >= 0 and age <= 200
(5)、管理表
创建表、修改表结构、删除表
三、使用T-SQL语句操作数据表
(1)、插入数据
insert [into] 表名 [列名] values <值列表>
#[into]是可选项,可以省略
#表名是必须的,而表的列名是可选的
#多个列名和多个值列表用逗号分隔
【举例:向student表中插入一行数据】
insrt into student (姓名,身份证号,成绩) values (‘王兰’,’123456’,’90’)
(2)、更新数据
update <表名> set <列名=更新值> [where <更新条件>]
#set后面可以紧随多个数据列的更新值,不限一个
#where子句是可选的,用来限制条件。如果不限制,则整个表的所有数据行被更新
【举例:向student表中王兰的成绩为95,添加备注为“学习好”】
update student set 成绩=’95’,备注=’学习好’,where 姓名=’王兰’
(3)、删除数据
1、使用delete语句删除表中的数据
delete from <表名> [where <删除条件>]
【举例:删除student表中学生王兰的记录】
delete from student where 姓名=’王兰’
【举例:删除student表中所有的记录】
delete from student
《注意》
delete……from……是删除整条记录,不会只删除单个字段,所以在delete不能出现字段名。
2、使用Truncate Table语句删除表中的数据
truncate table <表名>
【Truncate与Delete的区别】
a)TruncateTable不带where子句,只能将整个表数据清空,Delete可以带where子句,允许按条件删除某些记录
b)TruncateTable不记录事务日志,而Delete无论删除多少记录,都会每删除一行就记录一条事务日志。所以Truncate 删除数据后是无法通过事务日志恢复的
c)TruncateTable删除表中所有行,标识符列会重置为0。而Delete不会重置标识符列。
d)TruncateTable不能用于有外键约束引用的表,这种情况下,需要使用Delete语句
本文转自甘兵 51CTO博客,原文链接:http://blog.51cto.com/ganbing/1209546,如需转载请自行联系原作者