
第4章数据库中数据麦操作 前面的章节内容中,我们已经知道数据库是由数据和对象组成。一般而言,数据库中存 储有数据,但是如何正确高效地组织、显示和使用存放在数据库中的量据就需要一系列的数 据库对象来完成此重要任务。常见的数据库对象包括数据表、钓束,规则、视图、存结过程, 触发器等。本章首先简要介绍有关的数据岸对象,然后详细地介绍数据表、约束,默认和规 则四个数据库对象的使用,其它的数招库对象将在后续章节里一一介都。 41数据库对象 41.1数据表 创建了用户数据库之后,接下来的工作就是创建数据表。因为要使用数据库线需要数据 库中有种对象能够存储用户输入的各种数据,以后使用数据库完成各种应用也是在数据表的 基础上完成。所以数据表是数据岸中最重要的对象。 数据表被定义为列的集合,它与电子表格类以,数据在表中是按黑行和列的格式米组织 推列的。每行代表一个壁一的记录,每列代表记录中的一个域。例如一个包含学生基本信息 的数据表,表中的每一行代表一个学生,每一列分别表示学生的详细货料,如学号、姓名、 专业、班领等,如图4-l所示为student数据库中的学生基本信息表stu_info 图4-1数据表 SQLServer中每个数据库最多可储存20亿个数据表。每个表可以有1024列,每行最多 可以存储8060字节。SQLServer中有两种表:水久表和临时表。水久表在创建后一直存储 在数据库文件中,除事用户刷除该表:觞时表系统运行过程中由系饶创建。一旦用户退出成 系统修复时,临时表将核自动则除。 41,2约束 现在我们已经了解了创建用户数据岸和在数暴库中创建表以存储数据,读者白然会知道 数据库中的数据是现实世界的反映,各个数据之间有一定的联系和存在规则,如学生的学号 必類是难一的。学生姓名可能相同但学号一定不一样,每个学生的性别只能是“男”和“女” 中的一种取值,不可能有其它的取值存在。类似的例子有许多,这也说明一个题,一个成 功的数据库系统必须能够保证上述现实情况的实现,所以我们在学习约束这种数据库对象之 前,有必要先学习数据完整性知识。 什么是数据完整性呢?它就是指存储在爱据库中数据的一致性和正确性,为了保证数据 完整性,SqSv©r提供了定文、检查和控制数据完整性的机制.根据数据完整性错施所作
第 4 章 数据库中数据表操作 前面的章节内容中,我们已经知道数据库是由数据和对象组成。一般而言,数据库中存 储有数据,但是如何正确高效地组织、显示和使用存放在数据库中的数据就需要一系列的数 据库对象来完成此重要任务。常见的数据库对象包括数据表、约束、规则、视图、存储过程、 触发器等。本章首先简要介绍有关的数据库对象,然后详细地介绍数据表、约束、默认和规 则四个数据库对象的使用,其它的数据库对象将在后续章节里一一介绍。 4.1 数据库对象 4.1.1 数据表 创建了用户数据库之后,接下来的工作就是创建数据表。因为要使用数据库就需要数据 库中有种对象能够存储用户输入的各种数据,以后使用数据库完成各种应用也是在数据表的 基础上完成。所以数据表是数据库中最重要的对象。 数据表被定义为列的集合。它与电子表格类似,数据在表中是按照行和列的格式来组织 排列的。每行代表一个唯一的记录,每列代表记录中的一个域。例如一个包含学生基本信息 的数据表,表中的每一行代表一个学生,每一列分别表示学生的详细资料,如学号、姓名、 专业、班级等。如图 4-1 所示为 student 数据库中的学生基本信息表 stu_info。 图 4-1 数据表 SQLServer 中每个数据库最多可储存 20 亿个数据表,每个表可以有 1024 列,每行最多 可以存储 8060 字节。SQLServer 中有两种表:永久表和临时表。永久表在创建后一直存储 在数据库文件中,除非用户删除该表;临时表系统运行过程中由系统创建,一旦用户退出或 系统修复时,临时表将被自动删除。 4.1.2 约束 现在我们已经了解了创建用户数据库和在数据库中创建表以存储数据。读者自然会知道 数据库中的数据是现实世界的反映,各个数据之间有一定的联系和存在规则,如学生的学号 必须是唯一的,学生姓名可能相同但学号一定不一样;每个学生的性别只能是“男”和“女” 中的一种取值,不可能有其它的取值存在。类似的例子有许多,这也说明一个问题,一个成 功的数据库系统必须能够保证上述现实情况的实现。所以我们在学习约束这种数据库对象之 前,有必要先学习数据完整性知识。 什么是数据完整性呢?它就是指存储在数据库中数据的一致性和正确性。为了保证数据 完整性,SQLServer 提供了定义、检查和控制数据完整性的机制。根据数据完整性措施所作

用的数据库对象和范围不月,数据完整性分为:实体完整性,域完整性,参型完整性和用户 定义完整性四种。 实体完整性也成为行完整性,是将行定义为特定表的惟一实体。简而言之,表的所有记 求在某一列上必须取值惟一。如记承有多个学生信息的表,表中学号那个列对应的值每一行 都不相同,否则没有一个列米区分每一行,这将造成学生信息管理的混礼, 域完整性也称列完整性,用以指定列的数据输入是否具有正确的数据类型、格式以及有 效的数暴花围。如知学生每门课程的考试成绩必定是一个不大于100的正数值,如果表中存在 一个小于0的学生成境。肯定没有意义。 参展完整性是保证参型表与被参照表中数据的一致性。例如,学生基本信息表中有学生 的学号且学生成销表中也有学号这个列,那么两个表中的学号慎必须一政,如果输入过程中 出现错误且又没有被系统检查出,数据之间就违成混乱。 用户定义完整性允许用户定义不属于其它任何完整性分类的特定规则。所有的完整性类 型都支持用户定义完整性: 由此可见,保证数据完整性在数据库管理系统中十分重要。数据库系统中必须有些情施 米防止数据混乱的产生。建立和使用约束的目的就是保证数据的完整性,钓束是SS0VT 强制实行的应用规则。它通过限制列、行和表之间数据米保证数据完整性。 约束是种对象,它可以加到表上以限制列、行和表间的数据,当表副除时,表所带的的 束也随之被别除。约束包括CHECK约束、PRIMARYKEY约束、F可EIGNKEY约桌,NIE约束 和DEFAULT的束等,这线将在4,3节中介绍。 41.3默认 当我们在向数据表中输入数值时,希望表里面的某些列已经具有一些默认值,不必用户 一一输入,或者是用户现在还不准备输入但又不想空着。例如,输入学生性别的时候,先默 认所有学生的性别为“男”,如果输入的是个男生则“性别”列不必每次输入了,如果是女 生就将“男”改为“女”,这样大大减少输入数据的工作量。又如输入一个琉的课程信息, 由于全班同学在一个教室上课,都么设定数室一个默认值,则每个月学的上课数室就不必输 入了, 默认是实观上述目的的一种数据库对象,可以先定义好,需要到将它靠定到一列成多列 上,在表中插入数据行时,系统自动为设有指定数据的列提供事先定文的默认值。 4.1.4规则 我们有时遇到这种情况:一个班的学生学号往往是一受连续的正整数,我们设计的表被
用的数据库对象和范围不同,数据完整性分为:实体完整性、域完整性、参照完整性和用户 定义完整性四种。 实体完整性也成为行完整性,是将行定义为特定表的惟一实体。简而言之,表的所有记 录在某一列上必须取值惟一。如记录有多个学生信息的表,表中学号那个列对应的值每一行 都不相同,否则没有一个列来区分每一行,这将造成学生信息管理的混乱。 域完整性也称列完整性,用以指定列的数据输入是否具有正确的数据类型、格式以及有 效的数据范围。如学生每门课程的考试成绩必定是一个不大于 100 的正数值,如果表中存在 一个小于 0 的学生成绩,肯定没有意义。 参照完整性是保证参照表与被参照表中数据的一致性。例如,学生基本信息表中有学生 的学号且学生成绩表中也有学号这个列,那么两个表中的学号值必须一致,如果输入过程中 出现错误且又没有被系统检查出,数据之间就造成混乱。 用户定义完整性允许用户定义不属于其它任何完整性分类的特定规则。所有的完整性类 型都支持用户定义完整性。 由此可见,保证数据完整性在数据库管理系统中十分重要。数据库系统中必须有些措施 来防止数据混乱的产生。建立和使用约束的目的就是保证数据的完整性。约束是 SQLServer 强制实行的应用规则,它通过限制列、行和表之间数据来保证数据完整性。 约束是种对象,它可以加到表上以限制列、行和表间的数据,当表删除时,表所带的约 束也随之被删除。约束包括 CHECK 约束、PRIMARYKEY 约束、FOREIGNKEY 约束、UNIQUE 约束 和 DEFAULT 约束等,这些将在 4.3 节中介绍。 4.1.3 默认 当我们在向数据表中输入数值时,希望表里面的某些列已经具有一些默认值,不必用户 一一输入,或者是用户现在还不准备输入但又不想空着。例如,输入学生性别的时候,先默 认所有学生的性别为“男”,如果输入的是个男生则“性别”列不必每次输入了,如果是女 生就将“男”改为“女”,这样大大减少输入数据的工作量。又如输入一个班的课程信息, 由于全班同学在一个教室上课,那么设定教室一个默认值,则每个同学的上课教室就不必输 入了。 默认是实现上述目的的一种数据库对象,可以先定义好,需要时将它绑定到一列或多列 上,在表中插入数据行时,系统自动为没有指定数据的列提供事先定义的默认值。 4.1.4 规则 我们有时遇到这种情况:一个班的学生学号往往是一段连续的正整数,我们设计的表被

其它用户输入学号值时必领要有效而不旋是超出此范围的无效值:还有学生的身份证号码长 度要么是十五位要么是十八位,不可能是其它位数长度的数值,如果用户输入的身份证号码 长度不是这样就应改提醒用户数值验入有误。 线则这种数据库对象的作用瓷是当向表中括入数据时,指定该列接受数据值的范围,规 则与默认一样在数据库中只需定文一次,就可以被多次应用干任意表中的一列或多列上。 4.1.5图 我们从现实情况来了解祝图这种数据库对象。一般地,一个学生在一个学期要上多门课 程,这些课程的成锁存储在多张数据表里面,班主任想了解班上月学的学习成填,需要打开 一张张的表米看,能不能将存错在多张表中的误程成绩记录在同一张表上,目又不重新创建 一张新表来存储这线成领,因为误程成镜己经记录在单科课程表上,再汇总成一张新表就透 成数据多存储一游,即数据沉余。另外还有一种情况:班主任上教务科查询本班学生情况, 但教务科数据库中记录的是全校的学生信息,显然班主任只对木班学生感兴里,但全校的学 生却都在一张表上,查找起来数目繁多、头晕限花。 数据岸中有了视图这种对象,上述付题迫刀面解。视图是从一个或多个相关联表中派生 出来的。常用于集中、简化和定制最示数据库中的信息,它限制了用户所能看到和修改的数 据,视图象一个过滤渴。对于一个成多个基表中的数据进行筛选和引用。如上述问题中从各 科成绩表中将本班学生的成绩筛选出米做成一张视图,以后班主任直接看这个视图而不必一 张张的查询所有表可以查面到本班学生的成镜,将表中班主任感兴密的数据抽取出来做成 一张视图,这样班主任统只能看到本班学生的成镜而看不到其它班学生的成镜。这在一定程 度上可以保证数据的安全性。 概括地说。视图是一种虚数表,它不是数据库中的实际存在的表,其内容来白于其它一 些基表(理解这一点尤其重要)。但它与实际的表格在形式上相同,每个视图都含有列名与记 录。视图并不存储数据。因为它是虚拟表,视图中的数据实际上是对组成祝图的基表内存储 数据的引用,它来自于组成祝图的多张基本表。视图着重于特定数据,可以简化数据操作以 及组合区分数据。有关视图的创建、修改等操作将在第8章中如以介绍。 4.1.8存储过程 从前面章节的知识中,我们知道许多种数据库操作,如创建数据库、创建数据表,修改 数据岸属性等燥作既可以在企业管理器中完成,也可以在查询分析器中编写T-5语句命令 来完成,其实SQL.Server中所有的有关数据库(包括数据库对象)的操作均能编写T-SgL命令 语句在查询分析器中运行
其它用户输入学号值时必须要有效而不能是超出此范围的无效值;还有学生的身份证号码长 度要么是十五位要么是十八位,不可能是其它位数长度的数值,如果用户输入的身份证号码 长度不是这样就应改提醒用户数值输入有误。 规则这种数据库对象的作用就是当向表中插入数据时,指定该列接受数据值的范围。规 则与默认一样在数据库中只需定义一次,就可以被多次应用于任意表中的一列或多列上。 4.1.5 视图 我们从现实情况来了解视图这种数据库对象。一般地,一个学生在一个学期要上多门课 程,这些课程的成绩存储在多张数据表里面,班主任想了解班上同学的学习成绩,需要打开 一张张的表来看。能不能将存储在多张表中的课程成绩记录在同一张表上,但又不重新创建 一张新表来存储这些成绩,因为课程成绩已经记录在单科课程表上,再汇总成一张新表就造 成数据多存储一遍,即数据冗余。另外还有一种情况:班主任上教务科查询本班学生情况, 但教务科数据库中记录的是全校的学生信息,显然班主任只对本班学生感兴趣,但全校的学 生却都在一张表上,查找起来数目繁多、头晕眼花。 数据库中有了视图这种对象,上述问题迎刃而解。视图是从一个或多个相关联表中派生 出来的,常用于集中、简化和定制显示数据库中的信息。它限制了用户所能看到和修改的数 据,视图象一个过滤器,对于一个或多个基表中的数据进行筛选和引用。如上述问题中从各 科成绩表中将本班学生的成绩筛选出来做成一张视图,以后班主任直接看这个视图而不必一 张张的查询所有表就可以查询到本班学生的成绩。将表中班主任感兴趣的数据抽取出来做成 一张视图,这样班主任就只能看到本班学生的成绩而看不到其它班学生的成绩。这在一定程 度上可以保证数据的安全性。 概括地说,视图是一种虚拟表,它不是数据库中的实际存在的表,其内容来自于其它一 些基表(理解这一点尤其重要)。但它与实际的表格在形式上相同,每个视图都含有列名与记 录。视图并不存储数据,因为它是虚拟表,视图中的数据实际上是对组成视图的基表内存储 数据的引用,它来自于组成视图的多张基本表。视图着重于特定数据,可以简化数据操作以 及组合区分数据。有关视图的创建、修改等操作将在第 8 章中加以介绍。 4.1.6 存储过程 从前面章节的知识中,我们知道许多种数据库操作,如创建数据库、创建数据表、修改 数据库属性等操作既可以在企业管理器中完成,也可以在查询分析器中编写 T-SQL 语句命令 来完成。其实 SQLServer 中所有的有关数据库(包括数据库对象)的操作均能编写 T-SQL 命令 语句在查询分析器中运行

由此,我们头脑中自然会想到能否将一些T-5命令语句打包成一个数据库对象并存储 在SQLServer服务器上,等到需要完成这些T-SL语句的功能时就触发该数据库对象来完成 这些工作。这样做的好处是不必每次在查询分析器的窗口中重复编写T-5语句,而是编写 了一次,塑什么时候运行就话行:另外运行建度可大大如快。 存储过程就是这么一种数据库对象,它是存放在服务器上的预先编译好的T一SL语句, 它在第一次运行时进行语法检查和编译,编译好的存储过程在计算机的高速缓存中用于后续 调用,这样执行存储过程迅速而高效,存错过程由应用程序激话,而不是由SSVr自动 执行。 存储过程除了执行迅速高效的特点外,还可用于安全机制,用户可以被授权执行某些存 储过程。若要改变业务规则或策略。只需改写存储过程的语句再编译即可, SQLServer中的存储过程有两类:系统提供的存储过程和用户定义的存储过程。系统提 供的存储过程是系统已经编译好的存储过程,用户不能修政,主要供量据岸系统管理员管理 SQLServer提供支持,用户自定文存储过程是由用户创建并能完成某-特定功能(如查淘用 户所需的数据信息)的存储过程。 41.7触发器 上节中我们简要介绍了存储过程这个对象的概念和功能,存储过程的运行不是自动运行 而是由应用程序激发而运行。这里将要讲到的对象一一触发器,是一种能够自动运行的 SQLServer对象,它由机先设定的条作触发, 当用户在操作数据表中的数据时,系统管理员或应用程序开发人员有时要防止用户对某 些数据的修改和围障,以避免出现对数据进行不一致或不正确的修政,如果系统里面有编译 好的触发器,一旦用户对某些数据进行修改或刷除操作,事先设定的条件被满足镜触发触发 器的运行,要么是弹出一些对话框告诉用户正在对数据进行丰法操作,要么是此处数据的更 新引起其它记录或其它表中的数据的同步变化,从面避免出现数据不一数和不正确的混乱现 象。 触发器这种数据库对象主要作用就是可以象存储过程那样包含复杂的处理逻辑,实现的 束、规则等不伦实现的复象的数据完整性和一效性,并且由逐辑条件触发面白动执行。触发 器就像一个监程器一样时刻监视者用户的数据操作,一旦用户对数据的操作满足顶先设定的 条作,就立即触发一定的操作。 有关存储过程和触发器的侧建、修改等操作将在第9章中加以介绍。 42数据表的设计和创建
由此,我们头脑中自然会想到能否将一些 T-SQL 命令语句打包成一个数据库对象并存储 在 SQLServer 服务器上,等到需要完成这些 T-SQL 语句的功能时就触发该数据库对象来完成 这些工作。这样做的好处是不必每次在查询分析器的窗口中重复编写 T-SQL 语句,而是编写 了一次,想什么时候运行就运行;另外运行速度可大大加快。 存储过程就是这么一种数据库对象,它是存放在服务器上的预先编译好的 T-SQL 语句, 它在第一次运行时进行语法检查和编译,编译好的存储过程在计算机的高速缓存中用于后续 调用,这样执行存储过程迅速而高效。存储过程由应用程序激活,而不是由 SQLServer 自动 执行。 存储过程除了执行迅速高效的特点外,还可用于安全机制,用户可以被授权执行某些存 储过程。若要改变业务规则或策略,只需改写存储过程的语句再编译即可。 SQLServer 中的存储过程有两类:系统提供的存储过程和用户定义的存储过程。系统提 供的存储过程是系统已经编译好的存储过程,用户不能修改,主要供数据库系统管理员管理 SQLServer 提供支持。用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用 户所需的数据信息)的存储过程。 4.1.7 触发器 上节中我们简要介绍了存储过程这个对象的概念和功能。存储过程的运行不是自动运行 而是由应用程序激发而运行。这里将要讲到的对象——触发器,是一种能够自动运行的 SQLServer 对象,它由预先设定的条件触发。 当用户在操作数据表中的数据时,系统管理员或应用程序开发人员有时要防止用户对某 些数据的修改和删除,以避免出现对数据进行不一致或不正确的修改。如果系统里面有编译 好的触发器,一旦用户对某些数据进行修改或删除操作,事先设定的条件被满足就触发触发 器的运行,要么是弹出一些对话框告诉用户正在对数据进行非法操作,要么是此处数据的更 新引起其它记录或其它表中的数据的同步变化,从而避免出现数据不一致和不正确的混乱现 象。 触发器这种数据库对象主要作用就是可以象存储过程那样包含复杂的处理逻辑,实现约 束、规则等不能实现的复杂的数据完整性和一致性,并且由逻辑条件触发而自动执行。触发 器就像一个监视器一样时刻监视着用户的数据操作,一旦用户对数据的操作满足预先设定的 条件,就立即触发一定的操作。 有关存储过程和触发器的创建、修改等操作将在第 9 章中加以介绍。 4.2 数据表的设计和创建

4.2,1 SOLServer中的数据莫型 在创建表的时核,涉及列数据表结构的重要问题,也瓷是牵涉到确定数据表中各列数据 的格式。是数值、字符、日期还是货币、图像等其它格式的数据。因为只有设计好了数据表 中各列应该填写什么格式的数据,系饶就会在磁盘上开辟相应的空同,用户才能向表中填写 数据。因此在讲述数那表的操作前必须重点介绍SQLServer的数据类型, 在SOLServer数据表中列的数据类型既可以是系统提侯的数据类型,也可以是用户白定 义的数据类型。SQLServer系统提供了丰富的数据类型。如表-1所示, I.SQLServer所支持的数据类型 变量成列的数据类型定义了每一变量成列可以接受的数据值。包就是说,一个数据类型 指定变量或列所占用的内存空间,也决定访问、显示、更新数据的方法。表41列出了 SQLServer所支持的数据类型. 表4-1S0 LServer所支持的数据类型 数据类型说明 bigint--263(-922,337.203,685,477.580g)263-1(+922,337,203,685,477.5807)的整 型数据(所有数字) in-231(-2,147,483648)231-12,147,483,647)的整型数据(所有量字 sma111nt从-215(-32.768)到215-1(32,767)的整数数据 tinyint从0到255的整数数据 bi1或0的整数数据 deci国1-1038+1到1038-1的国定精度和小数位的数字数据 neric功绕上等问于decinal aney货币数据植介于一263与263-1之间,精确到货币单位的1s sa11y货币数据值介于-214.748.3848与+214,7483647之间,精确到货币单位的 1美 f1aat-1.79E+3081.79E+308的浮点精度数字 r0a1-3.40妮+38340E+38的浮点精度数字 date1ie1753年1月1日999湖年12月31日的日期和时间数据,精确到3路s(线3.33 毫秒) sm11 datet1m1900年1月1日`2079年8月6日的日期和时间数据,精确到分钟 char因定长度的非Inicode字符数据,最大长度为8,000个字符
4.2.1SQLServer 中的数据类型 在创建表的时候,涉及到数据表结构的重要问题,也就是牵涉到确定数据表中各列数据 的格式,是数值、字符、日期还是货币、图像等其它格式的数据。因为只有设计好了数据表 中各列应该填写什么格式的数据,系统就会在磁盘上开辟相应的空间,用户才能向表中填写 数据。因此在讲述数据表的操作前必须重点介绍 SQLServer 的数据类型。 在 SQLServer 数据表中列的数据类型既可以是系统提供的数据类型,也可以是用户自定 义的数据类型。SQLServer 系统提供了丰富的数据类型。如表 4-1 所示。 1.SQLServer 所支持的数据类型 变量或列的数据类型定义了每一变量或列可以接受的数据值。也就是说,一个数据类型 指定变量或列所占用的内存空间,也决定访问、显示、更新数据的方法。表 4-1 列出了 SQLServer 所支持的数据类型。 表 4-1SQLServer 所支持的数据类型 数据类型说明 bigint-263(-922,337,203,685,477.5808)~263-1(+922,337,203,685,477.5807) 的 整 型数据(所有数字) int-2^31(-2,147,483,648)~2^31-1(2,147,483,647)的整型数据(所有数字) smallint 从-2^15(-32,768)到 2^15-1(32,767)的整数数据 tinyint 从 0 到 255 的整数数据 bit1 或 0 的整数数据 decimal-1038+1 到 1038–1 的固定精度和小数位的数字数据 numeric 功能上等同于 decimal money 货币数据值介于-263 与 263-1 之间,精确到货币单位的 1% smallmoney 货币数据值介于-214,748.3648 与+214,748.3647 之间,精确到货币单位的 1% float-1.79E+308~1.79E+308 的浮点精度数字 real-3.40E+38~3.40E+38 的浮点精度数字 datetime1753 年 1 月 1 日~9999 年 12 月 31 日的日期和时间数据,精确到 3%s(或 3.33 毫秒) smalldatetime1900 年 1 月 1 日~2079 年 6 月 6 日的日期和时间数据,精确到分钟 char 固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符

varchar可变长度的事Unicode数据,最长为8,0o0个字符 text可变长度的非nic0o数据,最大长度为231-1(2.147,483,647)个字符 har周定长度的n1coe数据,最大长度为4,000个字符 varchar可变长度nicode数据。其最大长度为4,0O0字符 atext可变长度nicode数据,其最大长度为230-1(1,073,74l,823)个字符 binary固定长度的二进制数据,其最大长度为8,000个字节 arbinary可变长度的二进制数据,其最大长度为8,000个字节 iage可变长度的二谜制数据,其最大长度为231-1(2.147,483,647)个字节 curs0r游标的引用 sgl_variant一种存储SQLServer支持的各种数据类罩(text,ntext、timestar即和 sql_variant除外)值的数据类型 th1e一种特殊的数据类型,存储债以后处理的结果集 t imesta即夏据库范圆的唯一爱字,每次更新行时也进行更新 miqueidentifier全局唯一标识符(GUID) SqSr©r中的每个列,本地变量、表达式和参数都有一个相关的数据类型,一般情况 下,SQLServer是供的基本数据类型主要用于定义内存单元的数量。以便指定信息、大小和 存储格式的类型,存储列的格式,存储过程参数和本地变量, 2 SQLServer的最据类型说明 ()空值 在介绍SqL5eer2000支转的基本数据类型之前,让我门先来了解一下空值(N山)的概 念。数据列在定义之后,还需要确定该列是否允许空值L山。 空值(山》通常表示未知、不可用或将在以后添如的数据。若一个列允许为空值,则向 表中输入记录值时可不为该列给出具体值,而一个列不允许为空植,则在输入时多须给出具 体的值。空值与空格字符或者数字0是不月的。空格实际上是一个有效的字符,0则表示一 个有效的数字,而空值山)只不过表示这么一个概多,即我们目前尚不知道这个值是什么。 另外,空值也不同于一个长度为0的字符串。例如,如果某列的列定文中色合了0山 子句,那么则不能够插入该列为空的数据行。如果某列的列定义中包含可为空的山关健 字,则它可以接受空值(山》: 允许空值的列需要更多的存储空间,并且可能会有其他的性能或存储问题: 的字符型
varchar 可变长度的非 Unicode 数据,最长为 8,000 个字符 text 可变长度的非 Unicode 数据,最大长度为 2^31-1(2,147,483,647)个字符 nchar 固定长度的 Unicode 数据,最大长度为 4,000 个字符 nvarchar 可变长度 Unicode 数据,其最大长度为 4,000 字符 ntext 可变长度 Unicode 数据,其最大长度为 230-1(1,073,741,823)个字符 binary 固定长度的二进制数据,其最大长度为 8,000 个字节 varbinary 可变长度的二进制数据,其最大长度为 8,000 个字节 image 可变长度的二进制数据,其最大长度为 231-1(2,147,483,647)个字节 cursor 游标的引用 sql_variant 一种存储 SQLServer 支持的各种数据类型(text、ntext、timestamp 和 sql_variant 除外)值的数据类型 table 一种特殊的数据类型,存储供以后处理的结果集 timestamp 数据库范围的唯一数字,每次更新行时也进行更新 uniqueidentifier 全局唯一标识符(GUID) SQLServer 中的每个列、本地变量、表达式和参数都有一个相关的数据类型,一般情况 下,SQLServer 提供的基本数据类型主要用于定义内存单元的数量,以便指定信息、大小和 存储格式的类型,存储列的格式,存储过程参数和本地变量。 2.SQLServer 的数据类型说明 ⑴空值 在介绍 SQLServer2000 支持的基本数据类型之前,让我们先来了解一下空值(NULL)的概 念。数据列在定义之后,还需要确定该列是否允许空值(NULL)。 空值(NULL)通常表示未知、不可用或将在以后添加的数据。若一个列允许为空值,则向 表中输入记录值时可不为该列给出具体值,而一个列不允许为空值,则在输入时必须给出具 体的值。空值与空格字符或者数字 0 是不同的。空格实际上是一个有效的字符,0 则表示一 个有效的数字,而空值(NULL)只不过表示这么一个概念,即我们目前尚不知道这个值是什么。 另外,空值也不同于一个长度为 0 的字符串。例如,如果某列的列定义中包含了 NOTNULL 子句,那么则不能够插入该列为空的数据行。如果某列的列定义中包含可为空的 NULL 关键 字,则它可以接受空值(NULL)。 允许空值的列需要更多的存储空间,并且可能会有其他的性能或存储问题。 ⑵字符型

字符型数据类型主要用来存储由字母、数字和符号组成的字符串。又分为定长类型和变 长类重。 对于定长类型,可以用n米指定定长字符串的长度,chr()。输入的字长小于分配的 长度时,用空格填充:输入的字长大于分配的长度时,则白动截去多余部分。允许空值的定 长列可以内部转换成变长列, 对于变长类型,可以用n来指定字符串的最大长度,vacr().变长列中的数据会被 去掉尾部的空格:存储尺寸就是输入数据的实际长度,变长变量和参数中的数据保留所有空 格,但并不填满指定的长度。 对于字行型数据的存储来说,SQLServer提供了三种数据类型:char、varchar和text. 其中char用于存储长度园定的字符串;varchar用干存储长度可变的字符串:text用 于存储无限长的字符串(每行可达围。 char列中可以有字母、数字和符号,甚至Tab健和空格健,但不包括其他的非可打印 字符。字符列最大长度为32767个字符,char字符列是定长的。如果定义的字符列为00 个字符大小,则即使列中的数据小于400个字符,这些数据也要占用400个字符的磁盘空间。 archar列存储变长的字符数据。正确使用archar可以增如存储页的行数。当大多数 行具需占用一小留分空间,而有一些行要占用较多空何的时候,使用varchar数据类型是最 有效的。指定varchar数据类重的同时,也要指定最大长度。 通常情况下,char和varchar是最常川的字符串数据类型。它门的区别在于: ①当实际的字符串长度小于给定长度时,char类型会在实际的字符串尾部添如空格以 达到同定的字符数,而varchar类型则会丢掉尾部的空格以节省空间。 ②由于archar类型是长度可变的结构,因此需要颗外的开销米保存信息, 选用char还是varchar,要根据用户提供数据的长度而定。尽管长度可变结构需要额 外的开销,但它不香要填充尾都空格,通常能节省更多的空间,并且,数据长度的差别越大, 速用varchar的顿向线越大 (的二进制型 二进制型数据是指字符串是由二进制值组成,而不是由字符组成。该类型通常用于时间 标记(tinestamp)和i国e类坐. 对于二进制型数据的存储米说,SQLServer提供了三种数据类型,binary、varbinary 和ige。其中binary用于存储长度因定的二进制字符半:varbinary用于存储长度可变的 二进制字行审:i国用于存储大的二进制字行审(每行可达2B)
字符型数据类型主要用来存储由字母、数字和符号组成的字符串。又分为定长类型和变 长类型。 对于定长类型,可以用 n 来指定定长字符串的长度,char(n)。输入的字长小于分配的 长度时,用空格填充;输入的字长大于分配的长度时,则自动截去多余部分。允许空值的定 长列可以内部转换成变长列。 对于变长类型,可以用 n 来指定字符串的最大长度,varchar(n)。变长列中的数据会被 去掉尾部的空格;存储尺寸就是输入数据的实际长度。变长变量和参数中的数据保留所有空 格,但并不填满指定的长度。 对于字符型数据的存储来说,SQLServer 提供了三种数据类型:char、varchar 和 text。 其中 char 用于存储长度固定的字符串;varchar 用于存储长度可变的字符串;text 用 于存储无限长的字符串(每行可达 2GB)。 char 列中可以有字母、数字和符号,甚至 Tab 键和空格键,但不包括其他的非可打印 字符。字符列最大长度为 32767 个字符。char 字符列是定长的。如果定义的字符列为 400 个字符大小,则即使列中的数据小于 400 个字符,这些数据也要占用 400 个字符的磁盘空间。 varchar 列存储变长的字符数据。正确使用 varchar 可以增加存储页的行数。当大多数 行只需占用一小部分空间,而有一些行要占用较多空间的时候,使用 varchar 数据类型是最 有效的。指定 varchar 数据类型的同时,也要指定最大长度。 通常情况下,char 和 varchar 是最常用的字符串数据类型。它们的区别在于: ①当实际的字符串长度小于给定长度时,char 类型会在实际的字符串尾部添加空格以 达到固定的字符数,而 varchar 类型则会丢掉尾部的空格以节省空间。 ②由于 varchar 类型是长度可变的结构,因此需要额外的开销来保存信息。 选用 char 还是 varchar,要根据用户提供数据的长度而定。尽管长度可变结构需要额 外的开销,但它不需要填充尾部空格,通常能节省更多的空间,并且,数据长度的差别越大, 选用 varchar 的倾向就越大。 ⑶二进制型 二进制型数据是指字符串是由二进制值组成,而不是由字符组成,该类型通常用于时间 标记(timestamp)和 image 类型。 对于二进制型数据的存储来说,SQLServer 提供了三种数据类型:binary、varbinary 和 image。其中 binary 用于存储长度固定的二进制字符串;varbinary 用于存储长度可变的 二进制字符串;image 用于存储大的二进制字符串(每行可达 2GB)

binary型数据类权于字符型数据,当实际的字符串长度小于给定长度时,b1nary类型 会在实际的学符串尾部添加0,而不是空格。 (4)整型和精确数值型 SQLServer2O00提供的整型和精确数值型类型有,bit,1nt,sl1int,tiny1nt和 decinal、numeric,.其中最常用的就是int和numeric类型。int类型是指取值范围在 -2147483648到214743647之间的整数:ner1e类型则是指十进制数。 另外,bt数据类型可用于存储逻辑数据,可用作状态标志位,它只存储1或者0。并 且该类型的列不允许为空值、不允许建立素引、几个bt列可占用同一学节, (⑤浮点型 Sq5 erver2000提供了f1oaat和rea1类型来表示浮点数据类型和实型数据.其中f1oat 型数据的取值范围是-1.79E+308到1.79E+308:T©a1型数据的取值范围是-340E+38到 3.40E+38 ea1类型存储在4个字节中,可以在ra1数据类型中存储正的或者负的十进制数值: 如果不指定1at数据类型的长度,它会被存储在8个字节中。 用户可以指定10阳t型数值的长度,当指定为1到7之间的数值时,则实际上定义了一 个eal数据类重。 的日期型 S0 LServer2O00可以用datetine和s国l1 datetime数据类中来存储日期和时间数解, 其中sl14 atetime的精度较低,包含的日期范围也较窄,但占用的空同小。 山tetine型数据类型的取值范围是1753年1月1日到9999年12月31日,可以省略 datetime的部分值,们如果个部省席,则默认的取值为100,1,1.12:00:00:00AW。如果省 略的是时间部分,默认值为12:00:00:00。如果省略的是日期部分,则默认值为1,1,1900. sa11 datet1m型数据类型的取值范围是1900年1月1日到2079年6月8日,它的精 度小于datetime类型. 用户输入的d血tetine与Sal1 datetine类型数据格式完全相同.默认情况下,日期型 数据的格式是按照“月/日/年”的顺序米设定的。 (nicode字符串数据类型 SQLServer2O00提供了三种[micode字符串数据类型:nchar、nvarchar和ntet. SQLServerUnicode数据类型是基于SqL-92标准中的NationalCharacter数据类型的, SL-9妃使用前缓字符n来表示这些数据类型和值。使用icoe数据类型,一个列可以存
binary 型数据类似于字符型数据,当实际的字符串长度小于给定长度时,binary 类型 会在实际的字符串尾部添加 0,而不是空格。 ⑷整型和精确数值型 SQLServer2000 提供的整型和精确数值型类型有:bit、int、smallint、tinyint 和 decimal、numeric。其中最常用的就是 int 和 numeric 类型。int 类型是指取值范围在 -2147483648 到 2147483647 之间的整数;numeric 类型则是指十进制数。 另外,bit 数据类型可用于存储逻辑数据,可用作状态标志位,它只存储 1 或者 0。并 且该类型的列不允许为空值、不允许建立索引、几个 bit 列可占用同一字节。 ⑸浮点型 SQLServer2000 提供了 float 和 real 类型来表示浮点数据类型和实型数据。其中 float 型数据的取值范围是-1.79E+308 到 1.79E+308;real 型数据的取值范围是-3.40E+38 到 3.40E+38。 real 类型存储在 4 个字节中,可以在 real 数据类型中存储正的或者负的十进制数值; 如果不指定 float 数据类型的长度,它会被存储在 8 个字节中。 用户可以指定 float 型数值的长度,当指定为 1 到 7 之间的数值时,则实际上定义了一 个 real 数据类型。 ⑹日期型 SQLServer2000 可以用 datetime 和 smalldatetime 数据类型来存储日期和时间数据。 其中 smalldatetime 的精度较低,包含的日期范围也较窄,但占用的空间小。 datetime 型数据类型的取值范围是 1753 年 1 月 1 日到 9999 年 12 月 31 日,可以省略 datetime 的部分值,但如果全部省略,则默认的取值为 1900,1,1,12:00:00:00AM。如果省 略的是时间部分,默认值为 12:00:00:00。如果省略的是日期部分,则默认值为 1,1,1900。 smalldatetime 型数据类型的取值范围是 1900 年 1 月 1 日到 2079 年 6 月 6 日,它的精 度小于 datetime 类型。 用户输入的 datetime 与 Smalldatetime 类型数据格式完全相同。默认情况下,日期型 数据的格式是按照“月/日/年”的顺序来设定的。 ⑺Unicode 字符串数据类型 SQLServer2000 提供了三种 Unicode 字符串数据类型:nchar、nvarchar 和 ntext。 SQLServerUnicode 数据类型是基于 SQL-92 标准中的 NationalCharacter 数据类型的。 SQL-92 使用前缀字符 n 来表示这些数据类型和值。使用 Unicode 数据类型,一个列可以存

储由1co0标准所定义的任何字符,该字符但括各种字符集中所定义的所有学符。 其中,ntxt数据类型用米存储大量的文本,存储在其中的数据通常是直接能够输出到 显示设备上的字符,显示设备可以是显示器、窗口成者打印机。txt类型可以存储的数据 范围是1到2147483647个字节的数据。另外,值得注意的是,如果用text数据类型定义 列并且允许为空,则使用SERT语句且不插入任何值时,将不会分配任何空间,但是如果 使用PA配语句米更新数据库,则会至少分配2个字节的空间。 ge型的数据存储长度为1到21474647个字节的位模式。可以用来存储照片、目 录图片或者图画。通常存储在吧列中的数据不能直接用IST语句输入。 3用户定义数据类型 用户定文数据类型是基于SQLServer的系统提供数据类型。当多个表的列中要存储同样 类型的数据,且想确保这些列具有完全相月的数据类型、长度和是否为空属性时,可使用用 户定文数据类型。 创健用户定义的数据类型必须提供名称,新数据类型所依据的系统最据类型、数据类型 是否允许空值(如果未定义,系统将依据数据岸或选接的AS11默认设置进行指派), 我们可以利用企业管理器和T-S命令语句两种方法米创建用户定义数据类型,下面我 们分测用两种方法创建一个名为birthday,基于sa11 datet1,该列不允许为空值的用户 定义数据类型,以后在设计某些数据表中的“出生年月”列时就可应用此用户定义数据类型。 ①使用SqL5ever企业管理器创建用户定义的数据类型 省先在企业管理器中展开要创建用户定义数据类型的数据库,右击“用户定义数据类 型”,单击“新建用户定义数据类型”子某单,如图42所示。 接着在弹出的“用户定义数据类型属性”对话框中,知图43所示,输入新建数据类型 的名称一一birthday,并在“数据类型”列表中选释所基于的系统数据类型一一 sll山teti:还在“长度”栏中可以更改此数据类型可存储的最大数据长度。长度可变 的数据类型有:hinary、varchar、varchar,varbinary等。如果要允许此数据类型接受 空值,可选择“允许山值”,这里我们创建的数据类型是不能为空值,所以在这里就不勾 透。在对话框上的“规则”和“默认值”列表中遗择一个规则域默认值以将其第定到用户定 义的数据类吸上,我们这里不选。 最后点击确定按组,创建用户定义数据类型完毕。此时查看企业管理器就可以发现系统 中已有刚才创建的birthday的数据类型. ②利用T-SL金令语句创建用户定义数据类型
储由 Unicode 标准所定义的任何字符,该字符包括各种字符集中所定义的所有字符。 其中,ntext 数据类型用来存储大量的文本,存储在其中的数据通常是直接能够输出到 显示设备上的字符,显示设备可以是显示器、窗口或者打印机。ntext 类型可以存储的数据 范围是 1 到 2147483647 个字节的数据。另外,值得注意的是,如果用 ntext 数据类型定义 列并且允许为空,则使用 INSERT 语句且不插入任何值时,将不会分配任何空间,但是如果 使用 UPDATE 语句来更新数据库,则会至少分配 2 个字节的空间。 image 型的数据存储长度为 1 到 2147483647 个字节的位模式,可以用来存储照片、目 录图片或者图画。通常存储在 image 列中的数据不能直接用 INSERT 语句输入。 3.用户定义数据类型 用户定义数据类型是基于 SQLServer 的系统提供数据类型。当多个表的列中要存储同样 类型的数据,且想确保这些列具有完全相同的数据类型、长度和是否为空属性时,可使用用 户定义数据类型。 创建用户定义的数据类型必须提供名称、新数据类型所依据的系统数据类型、数据类型 是否允许空值(如果未定义,系统将依据数据库或连接的 ANSINull 默认设置进行指派)。 我们可以利用企业管理器和 T-SQL 命令语句两种方法来创建用户定义数据类型。下面我 们分别用两种方法创建一个名为 birthday,基于 smalldatetime,该列不允许为空值的用户 定义数据类型。以后在设计某些数据表中的“出生年月”列时就可应用此用户定义数据类型。 ①使用 SQLServer 企业管理器创建用户定义的数据类型 首先在企业管理器中展开要创建用户定义数据类型的数据库,右击“用户定义数据类 型”,单击“新建用户定义数据类型”子菜单,如图 4-2 所示。 接着在弹出的“用户定义数据类型属性”对话框中,如图 4-3 所示,输入新建数据类型 的名称——birthday,并在“数据类型”列表中选择所基于的系统数据类型—— smalldatetime;还在“长度”栏中可以更改此数据类型可存储的最大数据长度。长度可变 的数据类型有:binary、varchar、nvarchar、varbinary 等。如果要允许此数据类型接受 空值,可选择“允许 NULL 值”,这里我们创建的数据类型是不能为空值,所以在这里就不勾 选。在对话框上的“规则”和“默认值”列表中选择一个规则或默认值以将其绑定到用户定 义的数据类型上,我们这里不选。 最后点击确定按钮,创建用户定义数据类型完毕。此时查看企业管理器就可以发现系统 中已有刚才创建的 birthday 的数据类型。 ②利用 T-SQL 命令语句创建用户定义数据类型

T-SqL中用系统存储过程s印addtype来创建用户定文数据类型,sp_addtype具体的用 法读者可以查看SOLServer帮助文档,也可以参考下面的例圈. 【例4.1】在studeat数据库中创建一个名为birthday,基于alldatetine数据类型, 该列不允许为空值的用户定义数据类型。 USEstudent 00 EXECsp_addtypebirthday,smlldatetime,'NOTNULL' 【例42】在student数据库中创建一个名为gdy,基于varchar(10)数据类型,该列 允许为空值。 USEstudent 00 EXECsp_addtypegdqy,'VARCHAR(10)'.'NULL' 同刷除用户定义的数据类型 如图4-4所示,右击“用户定义的数据类型”,单击“副除”子菜单,在“除去对象 对话框中(如图45所示),单击“全部除去”按钮,就可完成到除用户定义的数据类型。 我们也可以在查淘分析器的窗口里编写运行T-S命令米剩除用户定文的数据类型。 【例43】酬除我们在student数据岸中创建的数据类型birthday: USEstudent 00 EXECsp_droptype'birthday 4.2.2数据表设计与创建 SQLServer数据库通常包含多个表,表是一个存储数据的实体。具有唯一的名称。可以 说数据体实际上是表的集合,具体的数据都是存储在表中的。表是对数据进行存储和操作的 一种逐辑结构。每一个表代表一个对象。例如,学生管理爱据库中,会有学生基本信息表 教师基本信息表、学生成镜表,课程信息表,专业代码表、教研室信息表,教室信息表等等: 这些表就是数据表,它们是由行和列组成的,通过表名和列名来武别数据。表中各列包含了 列的名字、数据类型以及列的其它属性,行包含了若干列的数据: 创建表的实质就是定复表的结构以及约束等,我们将分别用企业管理器和下-SL语句两 种方法创建表。在创建表之前的重要工作是设计表结构,即确定表的名字,所包含的各个列 的列名、列的数据类型和长度、是否为空值等
T-SQL 中用系统存储过程 sp_addtype 来创建用户定义数据类型,sp_addtype 具体的用 法读者可以查看 SQLServer 帮助文档,也可以参考下面的例题。 【例 4.1】在 student 数据库中创建一个名为 birthday,基于 smalldatetime 数据类型, 该列不允许为空值的用户定义数据类型。 USEstudent GO EXECsp_addtypebirthday,smalldatetime,'NOTNULL' 【例 4.2】在 student 数据库中创建一个名为 gdqy,基于 varchar(10)数据类型,该列 允许为空值。 USEstudent GO EXECsp_addtypegdqy,'VARCHAR(10)','NULL' ③删除用户定义的数据类型 如图 4-4 所示,右击“用户定义的数据类型”,单击“删除”子菜单,在“除去对象” 对话框中(如图 4-5 所示),单击“全部除去”按钮,就可完成删除用户定义的数据类型。 我们也可以在查询分析器的窗口里编写运行 T-SQL 命令来删除用户定义的数据类型。 【例 4.3】删除我们在 student 数据库中创建的数据类型 birthday。 USEstudent GO EXECsp_droptype'birthday' 4.2.2 数据表设计与创建 SQLServer 数据库通常包含多个表,表是一个存储数据的实体,具有唯一的名称。可以 说数据库实际上是表的集合,具体的数据都是存储在表中的。表是对数据进行存储和操作的 一种逻辑结构,每一个表代表一个对象。例如,学生管理数据库中,会有学生基本信息表、 教师基本信息表、学生成绩表、课程信息表、专业代码表、教研室信息表、教室信息表等等。 这些表就是数据表,它们是由行和列组成的,通过表名和列名来识别数据。表中各列包含了 列的名字、数据类型以及列的其它属性,行包含了若干列的数据。 创建表的实质就是定义表的结构以及约束等,我们将分别用企业管理器和 T-SQL 语句两 种方法创建表。在创建表之前的重要工作是设计表结构,即确定表的名字、所包含的各个列 的列名、列的数据类型和长度、是否为空值等