第 5章 表的操作与管理
5.1 数据类型
在 SQL Server2005 中,每个列、局部变量、表达式和参数都有其各自的数据类型。指定对象的数据类型相当于定义了该对象的四个特性:
( 1)对象所含的数据类型,如字符、整数或二进制数。
( 2)所存储值的长度或它的大小。
( 3)数字精度(仅用于数字数据类型)。
( 4)小数位数(仅用于数字数据类型)。
SQL Server提供系统数据类型集,定义了可与 SQL Server一起使用的所有数据类型;另外用户还可以使用 Transact-SQL或,NET
框架定义自己的数据类型,它是系统提供的数据类型的别名。每个表可以定义至多 250个字段,除文本和图像数据类型外,每个记录的最大长度限制为 1962个字节。
5.1.1 系统数据类型
1、精确数字类型;
2、近似数字类型;
3、日期和时间类型;
4、字符数据类型;
5,Unicode 字符数据类型;
6、二进制字符数据类型;
7、其它数据类型。
5.1.1 系统数据类型
1、精确数字类型
(1)精确数字类型包括:
整数类型 ;
Bit(位类型) ;
Decimal和 Numeric(数值类型) ;
Money和 SmallMoney(货币类型)。
5.1.1 系统数据类型
1、精确数字类型
(2)整数类型,
整数类型是最常用的数据类型之一,它主要用来存储数值,可以直接进 行数据运算,而不必使用函数转换。整数类型包括以下四类:
( 1) Bigint,Bigint数据类型可以存储从 (-9223372036854775808) 到
(9223372036854775807) 范围之间的所有整型数据。每个 Bigint数据类型值存储在 8个字节中。
( 2) Int( Integer),Int(或 integer)数据类型可以存储从( -
2147483648)到( 2147483647)范围之间的所有正负整数。每个 Int数据类型值存储在 4个字节中。
( 3) Smallint:可以存储从( -32768)到 32767范围之间的所有正负整数。每个 smallint类型的数据占用 2个字节的存储空间。
( 4) Tinyint:可以存储从 0~255范围之间的所有正整数。每个 tinyint类型的数据占用 1个字节的存储空间。
5.1.1 系统数据类型
1、精确数字类型
(3)位数据类型
Bit称为位数据类型,其数据有两种取值,0和 1,长度为 1字节。在输入
0以外的其他值时,系统均把它们当 1看待。这种数据类型常作为逻辑变量使用,用来表示真、假或是、否等二值选择。
(4)Decimal数据类型和 Numeric数据类型
Decimal数据类型和 Numeric数据类型完全相同,它们可以提供小数所需要的实际存储空间,但也有一定的限制,可以用 2~17个字节来存储 -
1038+1到 1038-1之间的固定精度和小数位的数字。也可以将其写为
Decimal( p,s)的形式,p和 s确定了精确的总位数和小数位。其中 p表示可供存储的值的总位数,默认设置为 18; s表示小数点后的位数,默认设置为 0。例如,decimal( 10,5),表示共有 10位数,其中整数 5位,
小数 5位。
5.1.1 系统数据类型
1、精确数字类型
(5)货币数据类型货币数据类型包括 Money和 SmallMoney两种:
( 1) Money:用于存储货币值,存储在 money数据类型中的数值以一个正数部分和一个小数部分存储在两个 4字节的整型值中,存储范围为( -9223372136854775808)到
( 9223372136854775807),精确到货币单位的千分之十。
( 2) Smallmoney:与 money数据类型类似,但范围比
money数据类型小,其存储范围为 -2147483468到
2147483467之间,精确到货币单位的千分之十。
当为 money或 smallmoney的表输入数据时,必须在有效位置前面加一个货币单位符号。
5.1.1 系统数据类型
2、近似数字类型
近似数字类型包括 Real和 Float两大类。
( 1) Real:可以存储正的或者负的十进制数值,最大可以有
7位精确位数。它的存储范围从 -3.40E-38~3.40E+38。每个
Real 类型的数据占用 4个字节的存储空间。
( 2) Float:可以精确到第 15位小数,其范围从 -1.79E-
308~1.79E+308。如果不指定 Float 数据类型的长度,它占用 8个字节的存储空间。 Float数据类型也可以写为 Float( n)
的形式,n指定 Float数据的精度,n为 1~15之间的整数值。
当 n取 1~7时,实际上是定义了一个 Real 类型的数据,系统用
4个字节存储它;当 n取 8~15时,系统认为其是 Float类型,
用 8个字节存储它。
5.1.1 系统数据类型
3,日期和时间数据类型
( 1) Datetime:用于存储日期和时间的结合体,它可以存储从公元 1753
年 1月 1日零时起 ~公元 9999年 12月 31日 23时 59分 59秒之间的所有日期和时间,其精确度可达三百分之一秒,即 3.33毫秒。 Datetime数据类型所占用的存储空间为 8个字节,其中前 4个字节用于存储基于 1900年 1月 1日之前或者之后日期数,数值分正负,负数存储的数值代表在基数日期之前的日期,正数表示基数日期之后的日期,时间以子夜后的毫秒存储在后面的 4个字节中。当存储 Datetime数据类型时,默认的格式是 MM DD
YYYY hh:mm A.M./P.M,当插入数据或者在其他地方使用 Datetime类型时,需要用单引号把它括起来。默认的时间日期是 January 1,1900 12:00
A.M。可以接受的输入格式如下,Jan 4 1999,JAN 4 1999,January 4
1999,Jan 1999 4,1999 4 Jan和 1999 Jan 4。
( 2) Smalldatetime:与 Datetime数据类型类似,但其日期时间范围较小,它存储从 1900年 1月 1日 ~2079年 6月 6日内的日期。 SmallDatetime
数据类型使用 4个字节存储数据,SQL Server 2000用 2个字节存储日期
1900年 1月 1日以后的天数,时间以子夜后的分钟数形式存储在另外两个字节中,SmallDatetime的精度为 1分钟。
5.1.1 系统数据类型
4,字符数据类型
字符数据类型也是 SQL Server中最常用的数据类型之一,它可以用来存储各种字母、数字符号和特殊符号。在使用字符数据类型时,需要在其前后加上英文单引号或者双引号。
( 1) Char:其定义形式为 Char( n),当用 Char数据类型存储数据时,每个字符和符号占用一个字节的存储空间。 n表示所有字符所占的存储空间,n的取值为
1~8000。若不指定 n值,系统默认 n的值为 1。若输入数据的字符串长度小于 n,
则系统自动在其后添加空格来填满设定好的空间;若输入的数据过长,将会截掉其超出部分。如果定义了一个 Char数据类型,而且允许该列为空,则该字段被当作 Varchar来处理。
( 2) Varchar:其定义形式为 Varchar( n)。用 Char数据类型可以存储长达 255
个字符的可变长度字符串,和 Char类型不同的是 Varchar类型的存储空间是根据存储在表的每一列值的字符数变化的。例如定义 Varchar( 20),则它对应的字段最多可以存储 20个字符,但是在每一列的长度达到 20字节之前系统不会在其后添加空格来填满设定好的空间,因此使用 Varchar类型可以节省空间。
( 3) Text:用于存储文本数据,其容量理论上为 1~231-1( 2,147,483,647)
个字节,但实际应用时要根据硬盘的存储空间而定。
5.1.1 系统数据类型
5,Unicode 字符数据类型
Unicode 字符数据类型包括 Nchar,Nvarchar,Ntext三种:
( 1) Nchar:其定义形式为 Nchar( n)。它与 Char数据类型类似,不同的是 Nchar数据类型 n的取值为 1~4000。 Nchar数据类型采用 Unicode
标准字符集,Unicode标准用两个字节为一个存储单位,其一个存储单位的容纳量就大大增加了,可以将全世界的语言文字都囊括在内,在一个数据列中就可以同时出现中文、英文、法文等,而不会出现编码冲突。
( 2) Nvarchar:其定义形式 Nvarchar( n)。它与 Varchchar数据类型相似,Nvarchar数据类型也采用 Unicode标准字符集,n的取值范围为
1~4000。
( 3) Ntext:与 Text数据类型类似,存储在其中的数据通常是直接能输出到显示设备上的字符,显示设备可以是显示器、窗口或者打印机。Ntext数据类型采用 Unicode标准字符集,因此其理论上的容量为 230-1
( 1,073,741,823)个字节。
5.1.1 系统数据类型
6,二进制字符数据类型
二进制数据类型包括 Binary,Varbinary,Image三种:
( 1) Binary:其定义形式为 Binary( n),数据的存储长度是固定的,即 n+4个字节,当输入的二进制数据长度小于 n时,
余下部分填充 0。二进制数据类型的最大长度(即 n的最大值)
为 8000,常用于存储图像等数据。
( 2) Varbinary:其定义形式为 Varbinary( n),数据的存储长度是变化的,它为实际所输入数据的长度加上 4字节。其他含义同 Binary。
( 3) Image:用于存储照片、目录图片或者图画,其理论容量为 231-1( 2,147,483,647)个字节。其存储数据的模式与 Text数据类型相同,通常存储在 Image字段中的数据不能直接用 Insert语句直接输入。
5.1.1 系统数据类型
7,其它数据类型
( 1) Sql_variant:用于存储除文本、图形数据和 Timestamp类型数据外的其他任何合法的
SQL Server数据。此数据类型极大地方便了 SQL Server的开发工作。
( 2) Table:用于存储对表或者视图处理后的结果集。这种新的数据类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便、快捷。
( 3) Timestamp:亦称时间戳数据类型,它提供数据库范围内的惟一值,反应数据库中数据修改的相对顺序,相当于一个单调上升的计数器。当它所定义的列在更新或者插入数据行时,
此列的值会被自动更新,一个计数值将自动地添加到此 Timestamp数据列中。如果建立一个名为,Timestamp”的列,则该列的类型将自动设为 Timestamp数据类型。
( 4) Uniqueidentifier:用于存储一个 16字节长的二进制数据类型,它是 SQL Server根据计算机网络适配器地址和 CPU时钟产生的全局惟一标识符代码( Globally Unique Identifier,简写为 GUID)。此数字可以通过调用 SQL Server的 newid()函数获得,在全球各地的计算机经由此函数产生的数字不会相同。
( 5) XML,可以存储 XML数据的数据类型。利用它可以将 XML实例存储在字段中或者 XML类型的变量中。注意存储在 XML中的数据不能超过 2GB。
( 6) Cursor:这是变量或存储过程 OUTPUT 参数的一种数据类型,这些参数包含对游标的引用。使用 Cursor 数据类型创建的变量可以为空。注意:对于 CREATE TABLE 语句中的列,
不能使用 Cursor 数据类型。
5.1.2 自定义数据类型
SQL Server允许用户自定义数据类型,用户自定义数据类型是建立在 SQL Server系统数据类型基础上的,
当用户定义一种数据类型时,需要指定该类型的名称、
建立在其上的系统数据类型以及是否允许为空等。
SQL Server为用户提供了两种方法来创建自定义数据类型:
( 1) 使用 SQL Server管理平台创建用户自定义数据类型;
( 2)利用系统存储过程创建用户自定义数据类型
5.1.2 自定义数据类型
( 1) 使用 SQL Server管理平台创建用户自定义数据类型在 SQL Server管理平台中,打开指定的服务器和数据库项,如图 5-1所示,选择并展开“程序
→ 类型”项,接下来用右键单击“用户自定义数据类型”选项,从弹出的快捷菜单中选择“新建”命令,出现用户定义的数据类型属性对话框,如图 5-2所示。
图 5-1 打开用户定义的数据类型窗口 图 5-2 用户定义的数据类型属性对话框
5.1.2 自定义数据类型
( 2) 利用系统存储过程创建用户自定义数据类型
系统存储过程 sp_addtype为用户提供了用 T_SQL语句创建自定义数据类型的途径,其语法形式如下:
sp_addtype [@typename=] type,
[@phystype=] system_data_type
[,[@nulltype=] ‘null_type’]
[,[@owner=] ‘owner_name’]
5.1.2 自定义数据类型
( 2) 利用系统存储过程创建用户自定义数据类型
例 5-1 自定义一个地址( address)数据类型。
程序清单如下:
exec sp_addtype address,‘varchar( 80)’,
‘not null’
5.2 表操作表是包含数据库中所有数据的数据库对象。表定义为列的集合,数据在表中是按行和列的格式组织排列的,每行代表惟一的一条记录,而每列代表记录中的一个域。
5.2.1 创建表
5.2.2 创建约束
5.2.3 修改表
5.2.4 查看表
5.2.5 删除表
5.2.1 创建表
1.利用 SQL Server管理平台创建表在 SQL Server管理平台中,展开指定的服务器和数据库,打开想要创建新表的数据库,右击表对象,
并从弹出的快捷菜单中选择“新建表”选项,如图 5-4所示。在图 5-4的对话框中,可以对表的结构进行更改,设置主键及字段属性,使用 SQL Server管理平台可以非常直观地修改数据库结构和添加数据。在表中任意行上右击,则弹出一个快捷菜单,如图 5-6所示。
图 5-4 新建表对话框 图 5-6 设置字段属性对话框
5.2.1 创建表
2,利用 create命令创建表
使用 create命令创建表非常灵活,它允许对表设置几种不同的选项,包括表名、
存放位置和列的属性等。
其完整语法形式如下:
CREATE TABLE
[database_name.[owner].|owner.]table_name
( {<column_definition>|column_name AS computed_column_expression|
<table_constraint>}[,…n] )
[ON{ filegroup|DEFAULT}]
[TEXTIMAGE_ON { filegroup|DEFAULT}]
<column_definition>::={column_name data_type}
[COLLATE <collation_name>]
[[DEFAULT constant_expression]
|[IDENTITY[( seed,increment ) [NOT FOR REPLICATION]]]]
[ROWGUIDCOL]
[<column_constraint>][...n]
5.2.1 创建表
2,利用 create命令创建表其中,各参数的说明如下,
database_name:用于指定所创建表的数据库名称。
owner:用于指定新建表的所有者的用户名。
table_name:用于指定新建表的名称。
column_name:用于指定新建表的列名。
computed_column_expression:用于指定计算列的列值表达式。
ON {filegroup | DEFAULT}:用于指定存储表的文件组名。
TEXTIMAGE_ON:用于指定 text,ntext 和 image 列的数据存储的文件组。
data_type:用于指定列的数据类型。
DEFAULT:用于指定列的默认值。
constant_expression:用于指定列的默认值的常量表达式、可以为一个常量或 NULL或系统函数。
IDENTITY:用于将列指定为标识列。 Seed:用于指定标识列的初始值。 Increment:用于指定标识列的增量值。
NOT FOR REPLICATION:用于指定列的 IDENTITY属性,在把从其他表中复制的数据插入到表中时不发生作用,即不生成列值,使得复制的数据行保持原来的列值。
ROWGUIDCOL:用于将列指定为全局惟一标识行号列( row global unique identifier column)。
COLLATE:用于指定表的校验方式。
column_constraint和 table_constraint:用于指定列约束和表约束。
5.2.1 创建表
2,利用 create命令创建表
例 5-3 创建了一个工人信息表,它包括工人编号、姓名、性别、
出生日期、职位、工资和备注信息。
SQL语句的程序清单如下:
CREATE TABLE worker
( number char(8) not null,
name char( 8) NOT NULL,
sex char( 2) NULL,
birthday datetime null,
job_title varchar( 10) null,
salary money null,
memo ntext null
)
5.2.2 创建约束
约束是 SQL Server提供的自动保持数据库完整性的一种方法,它通过限制字段中数据、记录中数据和表之间的数据来保证数据的完整性。在
SQL SERVER中,对于基本表的约束分为列约束和表约束。
列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名;表约束与列定义相互独立,
不包括在列定义中,通常用于对多个列一起进行约束,与列定义用’,’
分隔,定义表约束时必须指出要约束的那些列的名称。
完整性约束的基本语法格式为:
[CONSTRAINT constraint_name(约束名) ] <约束类型 >
约束不指定名称时,系统会给定一个名称。
在 SQL Server 2005中有 6种约束:主键约束( primary key
constraint)、惟一性约束( unique constraint)、检查约束( check
constraint)、默认约束( default constraint)、外部键约束
( foreign key constraint)和空值( NULL)约束。
5.2.2 创建约束
1.主键( PRIMARY KEY)约束
PRIMARY KEY约束用于定义基本表的主键,它是惟一确定表中每一条记录的标识符,其值不能为 NULL,也不能重复,以此来保证实体的完整性。 PRIMARY KEY与 UNIQUE约束类似,通过建立唯一索引来保证基本表在主键列取值的唯一性,但它们之间存在着很大的区别:
①在一个基本表中只能定义一个 PRIMARY KEY约束,但可定义多个
UNIQUE约束;
②对于指定为 PRIMARY KEY的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于 UNIQUE所约束的唯一键,则允许为空。
注意:不能为同一个列或一组列既定义 UNIQUE约束,又定义
PRIMARY KEY约束。
PRIMARY KEY既可用于列约束,也可用于表约束。
5.2.2 创建约束
1.主键( PRIMARY KEY)约束主键的创建操作方法有两种,SQL Server管理平台操作法和 Transact-
SQL语句操作法。
( 1) SQL Server管理平台操作法,如图 5-7所示。
图 5-7 选择多个字段共同做为主键对话框
5.2.2 创建约束
1.主键( PRIMARY KEY)约束
( 2)使用 Transact-SQL语句操作法设置主键约束,其语法形式如下:
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED|NONCLUSTERED]
( column_name)
PRIMARY KEY用于定义表约束时,即将某些列的组合定义为主键,其语法格式如下:
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED|NONCLUSTERED]
( column_name[,…n] )
5.2.2 创建约束
1.主键( PRIMARY KEY)约束例 5-5 建立一个 SC表,定义 SNO,CNO共同组成 SC的主键程序清单如下:
CREATE TABLE SC
(SNO CHAR(5) NOT NULL,
CNO CHAR(5) NOT NULL,
SCORE NUMERIC(3),
CONSTRAINT SC_PRIM PRIMARY KEY(SNO,CNO))
5.2.2 创建约束
2,惟一性约束惟一性约束用于指定一个或者多个列的组合值具有惟一性,以防止在列中输入重复的值。定义了 UNIQUE约束的那些列称为唯一键,系统自动为唯一键建立唯一索引,从而保证了唯一键的唯一性。
当使用惟一性约束时,需要考虑以下几个因素:
使用惟一性约束的字段允许为空值;
一个表中可以允许有多个惟一性约束;
可以把惟一性约束定义在多个字段上;
惟一性约束用于强制在指定字段上创建一个惟一性索引;
默认情况下,创建的索引类型为非聚集索引。
5.2.2 创建约束
2,惟一性约束创建惟一性约束的方法有两种:通过 SQL Server管理平台可以完成创建和修改惟一性约束的操作;使用 Transact-SQL语句完成惟一性约束的操作。
( 1)通过 SQL Server管理平台可以完成创建和修改惟一性约束的操作,如图 5-8所示。
图 5-8 创建惟一性约束对话框
5.2.2 创建约束
2,惟一性约束
( 2)使用 Transact-SQL语句完成惟一性约束的操作,其语法形式如下:
CONSTRAINT constraint_name
UNIQUE [CLUSTERED|NONCLUSTERED]
( column_name[,…n] )
例 5-6 创建一个学生信息表,其中 name字段具有惟一性。
程序清单如下:
Create table student(
id char( 8),
name char( 10),
sex char( 2),
constraint pk_id primary key( id),
constraint uk_identity unique( name)
)
5.2.2 创建约束
3,检查约束检查约束对输入列或者整个表中的值设置检查条件,以限制输入值,保证数据库数据的完整性。
当使用检查约束时,应该考虑和注意以下几点:
一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关;
一个表中可以定义多个检查约束;
每个 CREATE TABLE语句中每个字段只能定义一个检查约束;
在多个字段上定义检查约束,则必须将检查约束定义为表级约束;
当执行 INSERT语句或者 UPDATE语句时,检查约束将验证数据;
检查约束中不能包含子查询。
5.2.2 创建约束
3,检查约束创建检查约束常用的操作方法有如下两种,使用 SQL Server管理平台创建检查约束;用 Transact-SQL语句创建检查约束。
( 1)使用 SQL Server管理平台创建检查约束,如图 5-9所示。
图 5-9 创建检查约束对话框
5.2.2 创建约束
3,检查约束
( 2)用 Transact-SQL语句创建检查约束。
用 Transact-SQL语句创建检查约束。其语法形式如下:
CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)
例 5-8 建立一个 SC表,定义 SCORE 的取值范围为 0到 100之间。
程序清单如下:
CREATE TABLE SC
(SNO CHAR(5),
CNO CHAR(5),
SCORE NUMERIC(5,1) CONSTRAINT SCORE_CHK
CHECK(SCORE>=0 AND SCORE <=100))
5.2.2 创建约束
4,默认( DEFAULT)约束默认约束指定在插入操作中如果没有提供输入值时,则系统自动指定值。默认约束可以包括常量、函数、不带变元的内建函数或者空值。
使用默认约束时,应该注意以下几点:
( 1)每个字段只能定义一个默认约束;
( 2)如果定义的默认值长于其对应字段的允许长度,那么输入到表中的默认值将被截断;
( 3)不能加入到带有 IDENTITY属性或者数据类型为 timestamp的字段上;
( 4)如果字段定义为用户定义的数据类型,而且有一个默认绑定到这个数据类型上,则不允许该字段有默认约束。
5.2.2 创建约束
4,默认( DEFAULT)约束创建默认约束常用的操作方法有如下两种:使用 SQL Server管理平台创建默认约束;创建默认约束的 Transact-SQL语句操作法 。
( 1) 使用 SQL Server管理平台创建默认约束,如图 5-10所示 。
图 5-10 创建默认约束对话框
5.2.2 创建约束
4,默认( DEFAULT)约束
( 2) 创建默认约束的 Transact-SQL语句操作法 。 其语法形式如下:
CONSTRAINT constraint_name
DEFAULT constraint_expression [FOR
column_name]
例 5-10 为 dept字段创建默认约束。
程序清单如下:
constraint con_dept default ‘计算机’ for dept
5.2.2 创建约束
5,外部键约束外键 (FOREIGN KEY) 是用于建立和加强两个表数据之间的链接的一列或多列 。 外部键约束用于强制参照完整性 。
当使用外部键约束时,应该考虑以下几个因素:
外部键约束提供了字段参照完整性;
外部键从句中的字段数目和每个字段指定的数据类型都必须和
REFERENCES从句中的字段相匹配;
外部键约束不能自动创建索引,需要用户手动创建;
用户想要修改外部键约束的数据,必须有对外部键约束所参考表的 SELECT
权限或者 REFERENCES权限;
参考同一表中的字段时,必须只使用 REFERENCES子句,不能使用外部键子句;
一个表中最多可以有 31个外部键约束;
在临时表中,不能使用外部键约束;
主键和外部键的数据类型必须严格匹配
5.2.2 创建约束
5,外部键约束创建外部键约束常用的操作方法有如下两种:在 SQL Server管理平台中添加外部键约束;使用 Transact-SQL语句设置外部键约束 。
( 1) 在 SQL Server管理平台中添加外部键约束,在 SQL Server管理平台中添加外部键约束 。 如图 5-11,5-12所示 。
图 5-11 选择创建外键约束的字段 图 5-12 创建外键约束对话框
5.2.2 创建约束
5,外部键约束
( 2)使用 Transact-SQL语句设置外部键约束,其语法形式如下:
CONSTRAINT constraint_name
FOREIGN KEY ( column_name[,…n] )
REFERENCES ref_table [( ref_column[,…n] ) ]
例 5-11 建立一个 SC表,定义 SNO,CNO为 SC的外部键。
程序清单如下:
CREATE TABLE SC
(SNO CHAR(5) NOT NULL
CONSTRAINT S_FORE FOREIGN KEY REFERENCES S(SNO),
CNO CHAR(5) NOT NULL
CONSTRAINT C_FORE FOREIGN KEY REFERENCES C(CNO),
SCORE NUMERIC(3),
CONSTRAINT S_C_PRIM PRIMARY KEY (SNO,CNO))
5.2.2 创建约束
6,空值( NULL)约束
空值( NULL)约束用来控制是否允许该字段的值为 NULL。
NULL值不是 0也不是空白,更不是填入字符串的,NULL”字符串,而是表示“不知道”、,不确定”或“没有数据”的意思。
当某一字段的值一定要输入才有意义的时候,则可以设置为
NOT NULL。如主键列就不允许出现空值,否则就失去了唯一标识一条记录的作用。空值( NULL)约束只能用于定义列约束。
创建空值( NULL)约束常用的操作方法有如下两种:
( 1)在 SQL Server管理平台中添加空值( NULL)约束;
( 2)使用 Transact-SQL语句设置空值( NULL)约束。
5.2.2 创建约束
6,空值( NULL)约束
( 1)在 SQL Server管理平台中添加空值( NULL)约束。如图
5-14所示。
图 5-14设置空值( NULL)约束对话框
5.2.2 创建约束
6,空值( NULL)约束
( 2)使用 Transact-SQL语句设置空值( NULL)约束,其语法形式如下:
[CONSTRAINT <约束名 > ][NULL|NOT NULL]
例 5-13 建立一个 S表,对 SNO字段进行 NOT NULL约束。
程序清单如下:
CREATE TABLE S
(SNO CHAR(10) CONSTRAINT S_CONS NOT NULL,
SN VARCHAR(20),
AGE INT,
SEX CHAR(2) DEFAULT ’男’,
DEPT VARCHAR(20))
5.2.3 修改表当数据库中的表创建完成后,可以根据需要改变表中原先定义的许多选项,以更改表的结构。用户可以增加、删除和修改列,增加、删除和修改约束,更改表名以及改变表的所有者等。
1、修改列属性修改列属性包括以下一些内容:
( 1)修改列的数据类型;
( 2)修改列的数据长度;
( 3)修改列的精度;
( 4)修改列的小数位数;
( 5)修改列的为空性。
5.2.3 修改表
2、添加和删除列在 SQL Server 2005中,如果列允许空值或对列创建 DEFAULT 约束,则可以将列添加到现有表中。将新列添加到表时,SQL Server 2005数据库引擎在该列为表中的每个现有数据行插入一个值。因此,在向表中添加列时向列添加 DEFAULT定义会很有用。如果新列没有 DEFAULT定义,则必须指定该列允许空值。数据库引擎将空值插入该列,如果新列不允许空值,则返回错误。
反之,可以删除现有表中的列,但具有下列特征的列不能被删除:
( 1)用于索引;
( 2)用于 CHECK,FOREIGN KEY,UNIQUE 或 PRIMARY KEY约束;
( 3)与 DEFAULT 定义关联或绑定到某一默认对象;
( 4)绑定到规则;
( 5)已注册支持全文;
( 6)用作表的全文键。
5.2.3 修改表
3、增加、修改和删除约束
( 1)增加、修改和删除 PRIMARY KEY 约束。
( 2)增加、修改和删除 UNIQUE约束。
( 3)增加、修改和删除 CHECK约束。
( 4)增加、修改和删除 DEFAULT约束。
( 5)增加、修改和删除 FOREIGN KEY约束。
( 6)增加和修改标识符列。只能为每个表创建一个标识符列和一个 GUID 列。
5.2.3 修改表例 5-14 创建一个雇员信息表,然后在表中增加一个 salary字段,删除表中的 age字段,并且修改 memo字段的数据类型。
SQL语句的程序清单如下:
create table employees(
id char( 8) primary key,
name char( 20) not null,
department char( 20) null,
memo char( 30) null,
age int null,
)
alter table employees
add salary int null,
drop column age,
alter column memo varchar( 200) null
5.2.3 修改表例 5-15 在 S表中增加一个班号列和住址列。
SQL语句的程序清单如下:
ALTER TABLE S
ADD
CLASS_NO CHAR(6),
ADDRESS CHAR(40)
注意:使用此方式增加的新列自动填充 NULL值,所以不能为增加的新列指定 NOT NULL约束。
例 5-16 在 SC表中增加完整性约束定义,使 SCORE在 0-100之间。
SQL语句的程序清单如下:
ALTER TABLE SC
ADD
CONSTRAINT SCORE_CHK CHECK(SCORE BETWEEN 0 AND 100)
5.2.4 查看表当在数据库中创建了表后,有时需要查看表的有关信息 。 比如表的属性,
定义,数据,字段属性和索引等 。 尤其重要的是查看表内存放的数据,另外有时需要查看表与其他数据库对象之间的依赖关系 。
1,查看表的定义,如图 5-15,5-16所示 。
图 5-15 选择表格属性对话框 图 5-16 表格属性对话框
5.2.4 查看表
2,查看表中存储的数据,如图 5-17,5-18所示 。
图 5-17 选择打开表对话框 图 5-18 显示表格数据对话框
5.2.4 查看表
3,查看表与其他数据库对象的依赖关系,如图 5-19所示 。
图 5-19 显示相关性对话框
5.2.4 查看表
4,利用系统存储过程查看表的信息系统存储过程 Sp_help可以提供指定数据库对象的信息,也可以提供系统或者用户定义的数据类型的信息,其语法形式如下:
sp_help [[@objname=]name]
例 5-17 ( 1)显示当前数据库中所有对象的信息;( 2)显示表
Person.Contact 的信息。在 SQL Server管理平台的查询窗口中,它们对应的语句和运行结果如图 5-20和图 5-21所示图 5-20 所有数据库对象显示窗口 图 5-21 当前数据库对象显示窗口
5.2.5 删除表
1,利用管理平台删除表在 SQL Server管理平台中,展开指定的数据库和表,右击要删除的表,从弹出的快捷菜单中选择“删除”选项,则出现除去对象对话框,如图 5-25所示。
图 5-25 删除表对话框
5.2.5 删除表
2,利用 DROP TABLE语句删除表
DROP TABLE语句可以删除一个表和表中的数据及其与表有关的所有索引、触发器、约束、许可对象。
DROP TABLE语句的语法形式如下:
DROP TABLE table_name
要删除的表如果不在当前数据库中,则应在 table_name中指明其所属的数据库和用户名。在删除一个表之前要先删除与此表相关联的表中的外部关键字约束。当删除表后,绑定的规则或者默认值会自动松绑。
例 5-18 删除 company数据库中的表 employee。
程序如下:
drop table company.dbo.employee
5.3 索引操作索引是数据库随机检索的常用手段,它实际上就是记录的关键字与其相应地址的对应表。通过索引可大大提高查询速度。此外,在 SQL SERVER中,行的唯一性也是通过建立唯一索引来维护的。
使用索引可以大大提高系统的性能,其具体表现在:
( 1)通过创建惟一索引,可以保证数据记录的惟一性。
( 2)可以大大加快数据检索速度。
( 3)可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。
( 4)在使用 ORDER BY和 GROUP BY子句进行检索数据时,
可以显著减少查询中分组和排序的时间。
( 5)使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能
5.3.1 创建索引
SQL Server 2005提供了如下几种创建索引的方法:
1,利用 SQL Server管理平台创建索引;
2,利用 Transact-SQL语句中的 CREATE
INDEX命令创建索引。
另外,可以在创建表的 PRIMARY KEY或
UNIQUE约束时自动创建索引。
5.3.1 创建索引
1.利用 SQL Server管理平台创建索引。
(1)展开指定的服务器和数据库,选择要创建索引的表,展开该表,选择“索引”选项(如图
5-26所示),右键单击索引,从弹出的快捷菜单中选择“新建索引”,就会出现新建索引对话框,如图 5-27所示。
图 5-26 选择新建索引选项对话框 图 5-27 创建索引对话框
5.3.1 创建索引
1.利用 SQL Server管理平台创建索引。
( 2)点击“添加”按钮,可选择用于创建索引的字段,如图 5-28所示。
( 3)打开创建索引对话框的选项页框,在此还可以设定索引的属性,如图 5-29所示。
图 5-28 选择用于创建索引的字段 图 5-29 索引对话框的选项页框
5.3.1 创建索引
2.利用 Transact-SQL语句中的 CREATE INDEX命令创建索引
CREATE INDEX命令既可以创建一个可改变表的物理顺序的聚集索引,也可以创建提高查询性能的非聚集索引,其语法形式如下:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
INDEX index_name ON { table | view } ( column [ ASC | DESC ]
[,...n ] )
[with
[PAD_INDEX]
[[,]FILLFACTOR=fillfactor]
[[,]IGNORE_DUP_KEY]
[[,]DROP_EXISTING]
[[,]STATISTICS_NORECOMPUTE]
[[,]SORT_IN_TEMPDB]
]
[ ON filegroup ]
5.3.1 创建索引
2.利用 Transact-SQL语句中的 CREATE INDEX命令创建索引例 5-19 为表 employees创建了一个惟一聚集索引。
程序清单如下:
CREATE UNIQUE CLUSTERED INDEX number_ind
ON employees ( number)
with
pad_index,
fillfactor=20,
ignore_dup_key,
drop_existing,
statistics_norecompute
5.3.2 查看、修改和删除索引
1.利用 SQL Server管理平台查看、修改和删除索引。
( 1)在 SQL Server管理平台中,展开指定的服务器和数据库项,并展开要查看的表,从选项中选择“索引”选项,则会出现表中已存在的索引列表。双击某一索引名称,则出现索引属性对话框,如图 5-30所示。索引碎片管理页框如图 5-31所示。
图 5-30 索引属性对话框 图 5-31 索引碎片数据管理对话框
5.3.2 查看、修改和删除索引
1.利用 SQL Server管理平台查看、修改和删除索引。
( 2)扩展属性对话框,如图 5-32所示,主要包含数据库名称,校对模式等。
通过右键单击索引名称,选择“创建索引脚本到新的查询分析器窗口”,则可以查看创建索引的 SQL脚本语句,如图 5-33所示。
图 5-32 索引扩展属性对话框 图 5-33 索引的 SQL脚本对话框
5.3.2 查看、修改和删除索引
2,用系统存储过程查看和更改索引名称系统存储过程 sp_helpindex可以返回表的所有索引信息,其语法形式如下;
sp_helpindex [@objname=]’name’
其中,[@objname=]’name’参数用于指定当前数据库中的表的名称。
另外,系统存储过程 sp_rename可以用来更改索引的名称,其语法形式如下:
sp_rename[@objname=]'object_name',
[@newname=]'new_name'
[,[ @objtype = ] 'object_type' ]
5.3.2 查看、修改和删除索引
2,用系统存储过程查看和更改索引名称例 5-21 使用系统存储过程 sp_helpindex 来查看表 authors的索引信息。
运行结果如下图所示。
例 5-22 将 employees表中的索引名称 employees_name_index名称更改为 employees _name_ind。
程序清单如下:
exec sp_rename ‘employees.[employees_name_index]’,
‘employees_name_ ind’,‘index’
5.3.2 查看、修改和删除索引
3.使用 Transact-SQL语句中的 DROP INDEX命令删除索引
当不再需要某个索引时,可以将其删除,DROP INDEX命令可以删除一个或者多个当前数据库中的索引,其语法形式如下:
DROP INDEX 'table.index | view.index' [,...n ]
其中,table | view用于指定索引列所在的表或索引视图; index用于指定要删除的索引名称。
例 5-23 删除表 employees中的索引 employees_name_index。
程序清单如下:
drop index employees.employees_name_index
5.1 数据类型
在 SQL Server2005 中,每个列、局部变量、表达式和参数都有其各自的数据类型。指定对象的数据类型相当于定义了该对象的四个特性:
( 1)对象所含的数据类型,如字符、整数或二进制数。
( 2)所存储值的长度或它的大小。
( 3)数字精度(仅用于数字数据类型)。
( 4)小数位数(仅用于数字数据类型)。
SQL Server提供系统数据类型集,定义了可与 SQL Server一起使用的所有数据类型;另外用户还可以使用 Transact-SQL或,NET
框架定义自己的数据类型,它是系统提供的数据类型的别名。每个表可以定义至多 250个字段,除文本和图像数据类型外,每个记录的最大长度限制为 1962个字节。
5.1.1 系统数据类型
1、精确数字类型;
2、近似数字类型;
3、日期和时间类型;
4、字符数据类型;
5,Unicode 字符数据类型;
6、二进制字符数据类型;
7、其它数据类型。
5.1.1 系统数据类型
1、精确数字类型
(1)精确数字类型包括:
整数类型 ;
Bit(位类型) ;
Decimal和 Numeric(数值类型) ;
Money和 SmallMoney(货币类型)。
5.1.1 系统数据类型
1、精确数字类型
(2)整数类型,
整数类型是最常用的数据类型之一,它主要用来存储数值,可以直接进 行数据运算,而不必使用函数转换。整数类型包括以下四类:
( 1) Bigint,Bigint数据类型可以存储从 (-9223372036854775808) 到
(9223372036854775807) 范围之间的所有整型数据。每个 Bigint数据类型值存储在 8个字节中。
( 2) Int( Integer),Int(或 integer)数据类型可以存储从( -
2147483648)到( 2147483647)范围之间的所有正负整数。每个 Int数据类型值存储在 4个字节中。
( 3) Smallint:可以存储从( -32768)到 32767范围之间的所有正负整数。每个 smallint类型的数据占用 2个字节的存储空间。
( 4) Tinyint:可以存储从 0~255范围之间的所有正整数。每个 tinyint类型的数据占用 1个字节的存储空间。
5.1.1 系统数据类型
1、精确数字类型
(3)位数据类型
Bit称为位数据类型,其数据有两种取值,0和 1,长度为 1字节。在输入
0以外的其他值时,系统均把它们当 1看待。这种数据类型常作为逻辑变量使用,用来表示真、假或是、否等二值选择。
(4)Decimal数据类型和 Numeric数据类型
Decimal数据类型和 Numeric数据类型完全相同,它们可以提供小数所需要的实际存储空间,但也有一定的限制,可以用 2~17个字节来存储 -
1038+1到 1038-1之间的固定精度和小数位的数字。也可以将其写为
Decimal( p,s)的形式,p和 s确定了精确的总位数和小数位。其中 p表示可供存储的值的总位数,默认设置为 18; s表示小数点后的位数,默认设置为 0。例如,decimal( 10,5),表示共有 10位数,其中整数 5位,
小数 5位。
5.1.1 系统数据类型
1、精确数字类型
(5)货币数据类型货币数据类型包括 Money和 SmallMoney两种:
( 1) Money:用于存储货币值,存储在 money数据类型中的数值以一个正数部分和一个小数部分存储在两个 4字节的整型值中,存储范围为( -9223372136854775808)到
( 9223372136854775807),精确到货币单位的千分之十。
( 2) Smallmoney:与 money数据类型类似,但范围比
money数据类型小,其存储范围为 -2147483468到
2147483467之间,精确到货币单位的千分之十。
当为 money或 smallmoney的表输入数据时,必须在有效位置前面加一个货币单位符号。
5.1.1 系统数据类型
2、近似数字类型
近似数字类型包括 Real和 Float两大类。
( 1) Real:可以存储正的或者负的十进制数值,最大可以有
7位精确位数。它的存储范围从 -3.40E-38~3.40E+38。每个
Real 类型的数据占用 4个字节的存储空间。
( 2) Float:可以精确到第 15位小数,其范围从 -1.79E-
308~1.79E+308。如果不指定 Float 数据类型的长度,它占用 8个字节的存储空间。 Float数据类型也可以写为 Float( n)
的形式,n指定 Float数据的精度,n为 1~15之间的整数值。
当 n取 1~7时,实际上是定义了一个 Real 类型的数据,系统用
4个字节存储它;当 n取 8~15时,系统认为其是 Float类型,
用 8个字节存储它。
5.1.1 系统数据类型
3,日期和时间数据类型
( 1) Datetime:用于存储日期和时间的结合体,它可以存储从公元 1753
年 1月 1日零时起 ~公元 9999年 12月 31日 23时 59分 59秒之间的所有日期和时间,其精确度可达三百分之一秒,即 3.33毫秒。 Datetime数据类型所占用的存储空间为 8个字节,其中前 4个字节用于存储基于 1900年 1月 1日之前或者之后日期数,数值分正负,负数存储的数值代表在基数日期之前的日期,正数表示基数日期之后的日期,时间以子夜后的毫秒存储在后面的 4个字节中。当存储 Datetime数据类型时,默认的格式是 MM DD
YYYY hh:mm A.M./P.M,当插入数据或者在其他地方使用 Datetime类型时,需要用单引号把它括起来。默认的时间日期是 January 1,1900 12:00
A.M。可以接受的输入格式如下,Jan 4 1999,JAN 4 1999,January 4
1999,Jan 1999 4,1999 4 Jan和 1999 Jan 4。
( 2) Smalldatetime:与 Datetime数据类型类似,但其日期时间范围较小,它存储从 1900年 1月 1日 ~2079年 6月 6日内的日期。 SmallDatetime
数据类型使用 4个字节存储数据,SQL Server 2000用 2个字节存储日期
1900年 1月 1日以后的天数,时间以子夜后的分钟数形式存储在另外两个字节中,SmallDatetime的精度为 1分钟。
5.1.1 系统数据类型
4,字符数据类型
字符数据类型也是 SQL Server中最常用的数据类型之一,它可以用来存储各种字母、数字符号和特殊符号。在使用字符数据类型时,需要在其前后加上英文单引号或者双引号。
( 1) Char:其定义形式为 Char( n),当用 Char数据类型存储数据时,每个字符和符号占用一个字节的存储空间。 n表示所有字符所占的存储空间,n的取值为
1~8000。若不指定 n值,系统默认 n的值为 1。若输入数据的字符串长度小于 n,
则系统自动在其后添加空格来填满设定好的空间;若输入的数据过长,将会截掉其超出部分。如果定义了一个 Char数据类型,而且允许该列为空,则该字段被当作 Varchar来处理。
( 2) Varchar:其定义形式为 Varchar( n)。用 Char数据类型可以存储长达 255
个字符的可变长度字符串,和 Char类型不同的是 Varchar类型的存储空间是根据存储在表的每一列值的字符数变化的。例如定义 Varchar( 20),则它对应的字段最多可以存储 20个字符,但是在每一列的长度达到 20字节之前系统不会在其后添加空格来填满设定好的空间,因此使用 Varchar类型可以节省空间。
( 3) Text:用于存储文本数据,其容量理论上为 1~231-1( 2,147,483,647)
个字节,但实际应用时要根据硬盘的存储空间而定。
5.1.1 系统数据类型
5,Unicode 字符数据类型
Unicode 字符数据类型包括 Nchar,Nvarchar,Ntext三种:
( 1) Nchar:其定义形式为 Nchar( n)。它与 Char数据类型类似,不同的是 Nchar数据类型 n的取值为 1~4000。 Nchar数据类型采用 Unicode
标准字符集,Unicode标准用两个字节为一个存储单位,其一个存储单位的容纳量就大大增加了,可以将全世界的语言文字都囊括在内,在一个数据列中就可以同时出现中文、英文、法文等,而不会出现编码冲突。
( 2) Nvarchar:其定义形式 Nvarchar( n)。它与 Varchchar数据类型相似,Nvarchar数据类型也采用 Unicode标准字符集,n的取值范围为
1~4000。
( 3) Ntext:与 Text数据类型类似,存储在其中的数据通常是直接能输出到显示设备上的字符,显示设备可以是显示器、窗口或者打印机。Ntext数据类型采用 Unicode标准字符集,因此其理论上的容量为 230-1
( 1,073,741,823)个字节。
5.1.1 系统数据类型
6,二进制字符数据类型
二进制数据类型包括 Binary,Varbinary,Image三种:
( 1) Binary:其定义形式为 Binary( n),数据的存储长度是固定的,即 n+4个字节,当输入的二进制数据长度小于 n时,
余下部分填充 0。二进制数据类型的最大长度(即 n的最大值)
为 8000,常用于存储图像等数据。
( 2) Varbinary:其定义形式为 Varbinary( n),数据的存储长度是变化的,它为实际所输入数据的长度加上 4字节。其他含义同 Binary。
( 3) Image:用于存储照片、目录图片或者图画,其理论容量为 231-1( 2,147,483,647)个字节。其存储数据的模式与 Text数据类型相同,通常存储在 Image字段中的数据不能直接用 Insert语句直接输入。
5.1.1 系统数据类型
7,其它数据类型
( 1) Sql_variant:用于存储除文本、图形数据和 Timestamp类型数据外的其他任何合法的
SQL Server数据。此数据类型极大地方便了 SQL Server的开发工作。
( 2) Table:用于存储对表或者视图处理后的结果集。这种新的数据类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便、快捷。
( 3) Timestamp:亦称时间戳数据类型,它提供数据库范围内的惟一值,反应数据库中数据修改的相对顺序,相当于一个单调上升的计数器。当它所定义的列在更新或者插入数据行时,
此列的值会被自动更新,一个计数值将自动地添加到此 Timestamp数据列中。如果建立一个名为,Timestamp”的列,则该列的类型将自动设为 Timestamp数据类型。
( 4) Uniqueidentifier:用于存储一个 16字节长的二进制数据类型,它是 SQL Server根据计算机网络适配器地址和 CPU时钟产生的全局惟一标识符代码( Globally Unique Identifier,简写为 GUID)。此数字可以通过调用 SQL Server的 newid()函数获得,在全球各地的计算机经由此函数产生的数字不会相同。
( 5) XML,可以存储 XML数据的数据类型。利用它可以将 XML实例存储在字段中或者 XML类型的变量中。注意存储在 XML中的数据不能超过 2GB。
( 6) Cursor:这是变量或存储过程 OUTPUT 参数的一种数据类型,这些参数包含对游标的引用。使用 Cursor 数据类型创建的变量可以为空。注意:对于 CREATE TABLE 语句中的列,
不能使用 Cursor 数据类型。
5.1.2 自定义数据类型
SQL Server允许用户自定义数据类型,用户自定义数据类型是建立在 SQL Server系统数据类型基础上的,
当用户定义一种数据类型时,需要指定该类型的名称、
建立在其上的系统数据类型以及是否允许为空等。
SQL Server为用户提供了两种方法来创建自定义数据类型:
( 1) 使用 SQL Server管理平台创建用户自定义数据类型;
( 2)利用系统存储过程创建用户自定义数据类型
5.1.2 自定义数据类型
( 1) 使用 SQL Server管理平台创建用户自定义数据类型在 SQL Server管理平台中,打开指定的服务器和数据库项,如图 5-1所示,选择并展开“程序
→ 类型”项,接下来用右键单击“用户自定义数据类型”选项,从弹出的快捷菜单中选择“新建”命令,出现用户定义的数据类型属性对话框,如图 5-2所示。
图 5-1 打开用户定义的数据类型窗口 图 5-2 用户定义的数据类型属性对话框
5.1.2 自定义数据类型
( 2) 利用系统存储过程创建用户自定义数据类型
系统存储过程 sp_addtype为用户提供了用 T_SQL语句创建自定义数据类型的途径,其语法形式如下:
sp_addtype [@typename=] type,
[@phystype=] system_data_type
[,[@nulltype=] ‘null_type’]
[,[@owner=] ‘owner_name’]
5.1.2 自定义数据类型
( 2) 利用系统存储过程创建用户自定义数据类型
例 5-1 自定义一个地址( address)数据类型。
程序清单如下:
exec sp_addtype address,‘varchar( 80)’,
‘not null’
5.2 表操作表是包含数据库中所有数据的数据库对象。表定义为列的集合,数据在表中是按行和列的格式组织排列的,每行代表惟一的一条记录,而每列代表记录中的一个域。
5.2.1 创建表
5.2.2 创建约束
5.2.3 修改表
5.2.4 查看表
5.2.5 删除表
5.2.1 创建表
1.利用 SQL Server管理平台创建表在 SQL Server管理平台中,展开指定的服务器和数据库,打开想要创建新表的数据库,右击表对象,
并从弹出的快捷菜单中选择“新建表”选项,如图 5-4所示。在图 5-4的对话框中,可以对表的结构进行更改,设置主键及字段属性,使用 SQL Server管理平台可以非常直观地修改数据库结构和添加数据。在表中任意行上右击,则弹出一个快捷菜单,如图 5-6所示。
图 5-4 新建表对话框 图 5-6 设置字段属性对话框
5.2.1 创建表
2,利用 create命令创建表
使用 create命令创建表非常灵活,它允许对表设置几种不同的选项,包括表名、
存放位置和列的属性等。
其完整语法形式如下:
CREATE TABLE
[database_name.[owner].|owner.]table_name
( {<column_definition>|column_name AS computed_column_expression|
<table_constraint>}[,…n] )
[ON{ filegroup|DEFAULT}]
[TEXTIMAGE_ON { filegroup|DEFAULT}]
<column_definition>::={column_name data_type}
[COLLATE <collation_name>]
[[DEFAULT constant_expression]
|[IDENTITY[( seed,increment ) [NOT FOR REPLICATION]]]]
[ROWGUIDCOL]
[<column_constraint>][...n]
5.2.1 创建表
2,利用 create命令创建表其中,各参数的说明如下,
database_name:用于指定所创建表的数据库名称。
owner:用于指定新建表的所有者的用户名。
table_name:用于指定新建表的名称。
column_name:用于指定新建表的列名。
computed_column_expression:用于指定计算列的列值表达式。
ON {filegroup | DEFAULT}:用于指定存储表的文件组名。
TEXTIMAGE_ON:用于指定 text,ntext 和 image 列的数据存储的文件组。
data_type:用于指定列的数据类型。
DEFAULT:用于指定列的默认值。
constant_expression:用于指定列的默认值的常量表达式、可以为一个常量或 NULL或系统函数。
IDENTITY:用于将列指定为标识列。 Seed:用于指定标识列的初始值。 Increment:用于指定标识列的增量值。
NOT FOR REPLICATION:用于指定列的 IDENTITY属性,在把从其他表中复制的数据插入到表中时不发生作用,即不生成列值,使得复制的数据行保持原来的列值。
ROWGUIDCOL:用于将列指定为全局惟一标识行号列( row global unique identifier column)。
COLLATE:用于指定表的校验方式。
column_constraint和 table_constraint:用于指定列约束和表约束。
5.2.1 创建表
2,利用 create命令创建表
例 5-3 创建了一个工人信息表,它包括工人编号、姓名、性别、
出生日期、职位、工资和备注信息。
SQL语句的程序清单如下:
CREATE TABLE worker
( number char(8) not null,
name char( 8) NOT NULL,
sex char( 2) NULL,
birthday datetime null,
job_title varchar( 10) null,
salary money null,
memo ntext null
)
5.2.2 创建约束
约束是 SQL Server提供的自动保持数据库完整性的一种方法,它通过限制字段中数据、记录中数据和表之间的数据来保证数据的完整性。在
SQL SERVER中,对于基本表的约束分为列约束和表约束。
列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名;表约束与列定义相互独立,
不包括在列定义中,通常用于对多个列一起进行约束,与列定义用’,’
分隔,定义表约束时必须指出要约束的那些列的名称。
完整性约束的基本语法格式为:
[CONSTRAINT constraint_name(约束名) ] <约束类型 >
约束不指定名称时,系统会给定一个名称。
在 SQL Server 2005中有 6种约束:主键约束( primary key
constraint)、惟一性约束( unique constraint)、检查约束( check
constraint)、默认约束( default constraint)、外部键约束
( foreign key constraint)和空值( NULL)约束。
5.2.2 创建约束
1.主键( PRIMARY KEY)约束
PRIMARY KEY约束用于定义基本表的主键,它是惟一确定表中每一条记录的标识符,其值不能为 NULL,也不能重复,以此来保证实体的完整性。 PRIMARY KEY与 UNIQUE约束类似,通过建立唯一索引来保证基本表在主键列取值的唯一性,但它们之间存在着很大的区别:
①在一个基本表中只能定义一个 PRIMARY KEY约束,但可定义多个
UNIQUE约束;
②对于指定为 PRIMARY KEY的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于 UNIQUE所约束的唯一键,则允许为空。
注意:不能为同一个列或一组列既定义 UNIQUE约束,又定义
PRIMARY KEY约束。
PRIMARY KEY既可用于列约束,也可用于表约束。
5.2.2 创建约束
1.主键( PRIMARY KEY)约束主键的创建操作方法有两种,SQL Server管理平台操作法和 Transact-
SQL语句操作法。
( 1) SQL Server管理平台操作法,如图 5-7所示。
图 5-7 选择多个字段共同做为主键对话框
5.2.2 创建约束
1.主键( PRIMARY KEY)约束
( 2)使用 Transact-SQL语句操作法设置主键约束,其语法形式如下:
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED|NONCLUSTERED]
( column_name)
PRIMARY KEY用于定义表约束时,即将某些列的组合定义为主键,其语法格式如下:
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED|NONCLUSTERED]
( column_name[,…n] )
5.2.2 创建约束
1.主键( PRIMARY KEY)约束例 5-5 建立一个 SC表,定义 SNO,CNO共同组成 SC的主键程序清单如下:
CREATE TABLE SC
(SNO CHAR(5) NOT NULL,
CNO CHAR(5) NOT NULL,
SCORE NUMERIC(3),
CONSTRAINT SC_PRIM PRIMARY KEY(SNO,CNO))
5.2.2 创建约束
2,惟一性约束惟一性约束用于指定一个或者多个列的组合值具有惟一性,以防止在列中输入重复的值。定义了 UNIQUE约束的那些列称为唯一键,系统自动为唯一键建立唯一索引,从而保证了唯一键的唯一性。
当使用惟一性约束时,需要考虑以下几个因素:
使用惟一性约束的字段允许为空值;
一个表中可以允许有多个惟一性约束;
可以把惟一性约束定义在多个字段上;
惟一性约束用于强制在指定字段上创建一个惟一性索引;
默认情况下,创建的索引类型为非聚集索引。
5.2.2 创建约束
2,惟一性约束创建惟一性约束的方法有两种:通过 SQL Server管理平台可以完成创建和修改惟一性约束的操作;使用 Transact-SQL语句完成惟一性约束的操作。
( 1)通过 SQL Server管理平台可以完成创建和修改惟一性约束的操作,如图 5-8所示。
图 5-8 创建惟一性约束对话框
5.2.2 创建约束
2,惟一性约束
( 2)使用 Transact-SQL语句完成惟一性约束的操作,其语法形式如下:
CONSTRAINT constraint_name
UNIQUE [CLUSTERED|NONCLUSTERED]
( column_name[,…n] )
例 5-6 创建一个学生信息表,其中 name字段具有惟一性。
程序清单如下:
Create table student(
id char( 8),
name char( 10),
sex char( 2),
constraint pk_id primary key( id),
constraint uk_identity unique( name)
)
5.2.2 创建约束
3,检查约束检查约束对输入列或者整个表中的值设置检查条件,以限制输入值,保证数据库数据的完整性。
当使用检查约束时,应该考虑和注意以下几点:
一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关;
一个表中可以定义多个检查约束;
每个 CREATE TABLE语句中每个字段只能定义一个检查约束;
在多个字段上定义检查约束,则必须将检查约束定义为表级约束;
当执行 INSERT语句或者 UPDATE语句时,检查约束将验证数据;
检查约束中不能包含子查询。
5.2.2 创建约束
3,检查约束创建检查约束常用的操作方法有如下两种,使用 SQL Server管理平台创建检查约束;用 Transact-SQL语句创建检查约束。
( 1)使用 SQL Server管理平台创建检查约束,如图 5-9所示。
图 5-9 创建检查约束对话框
5.2.2 创建约束
3,检查约束
( 2)用 Transact-SQL语句创建检查约束。
用 Transact-SQL语句创建检查约束。其语法形式如下:
CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)
例 5-8 建立一个 SC表,定义 SCORE 的取值范围为 0到 100之间。
程序清单如下:
CREATE TABLE SC
(SNO CHAR(5),
CNO CHAR(5),
SCORE NUMERIC(5,1) CONSTRAINT SCORE_CHK
CHECK(SCORE>=0 AND SCORE <=100))
5.2.2 创建约束
4,默认( DEFAULT)约束默认约束指定在插入操作中如果没有提供输入值时,则系统自动指定值。默认约束可以包括常量、函数、不带变元的内建函数或者空值。
使用默认约束时,应该注意以下几点:
( 1)每个字段只能定义一个默认约束;
( 2)如果定义的默认值长于其对应字段的允许长度,那么输入到表中的默认值将被截断;
( 3)不能加入到带有 IDENTITY属性或者数据类型为 timestamp的字段上;
( 4)如果字段定义为用户定义的数据类型,而且有一个默认绑定到这个数据类型上,则不允许该字段有默认约束。
5.2.2 创建约束
4,默认( DEFAULT)约束创建默认约束常用的操作方法有如下两种:使用 SQL Server管理平台创建默认约束;创建默认约束的 Transact-SQL语句操作法 。
( 1) 使用 SQL Server管理平台创建默认约束,如图 5-10所示 。
图 5-10 创建默认约束对话框
5.2.2 创建约束
4,默认( DEFAULT)约束
( 2) 创建默认约束的 Transact-SQL语句操作法 。 其语法形式如下:
CONSTRAINT constraint_name
DEFAULT constraint_expression [FOR
column_name]
例 5-10 为 dept字段创建默认约束。
程序清单如下:
constraint con_dept default ‘计算机’ for dept
5.2.2 创建约束
5,外部键约束外键 (FOREIGN KEY) 是用于建立和加强两个表数据之间的链接的一列或多列 。 外部键约束用于强制参照完整性 。
当使用外部键约束时,应该考虑以下几个因素:
外部键约束提供了字段参照完整性;
外部键从句中的字段数目和每个字段指定的数据类型都必须和
REFERENCES从句中的字段相匹配;
外部键约束不能自动创建索引,需要用户手动创建;
用户想要修改外部键约束的数据,必须有对外部键约束所参考表的 SELECT
权限或者 REFERENCES权限;
参考同一表中的字段时,必须只使用 REFERENCES子句,不能使用外部键子句;
一个表中最多可以有 31个外部键约束;
在临时表中,不能使用外部键约束;
主键和外部键的数据类型必须严格匹配
5.2.2 创建约束
5,外部键约束创建外部键约束常用的操作方法有如下两种:在 SQL Server管理平台中添加外部键约束;使用 Transact-SQL语句设置外部键约束 。
( 1) 在 SQL Server管理平台中添加外部键约束,在 SQL Server管理平台中添加外部键约束 。 如图 5-11,5-12所示 。
图 5-11 选择创建外键约束的字段 图 5-12 创建外键约束对话框
5.2.2 创建约束
5,外部键约束
( 2)使用 Transact-SQL语句设置外部键约束,其语法形式如下:
CONSTRAINT constraint_name
FOREIGN KEY ( column_name[,…n] )
REFERENCES ref_table [( ref_column[,…n] ) ]
例 5-11 建立一个 SC表,定义 SNO,CNO为 SC的外部键。
程序清单如下:
CREATE TABLE SC
(SNO CHAR(5) NOT NULL
CONSTRAINT S_FORE FOREIGN KEY REFERENCES S(SNO),
CNO CHAR(5) NOT NULL
CONSTRAINT C_FORE FOREIGN KEY REFERENCES C(CNO),
SCORE NUMERIC(3),
CONSTRAINT S_C_PRIM PRIMARY KEY (SNO,CNO))
5.2.2 创建约束
6,空值( NULL)约束
空值( NULL)约束用来控制是否允许该字段的值为 NULL。
NULL值不是 0也不是空白,更不是填入字符串的,NULL”字符串,而是表示“不知道”、,不确定”或“没有数据”的意思。
当某一字段的值一定要输入才有意义的时候,则可以设置为
NOT NULL。如主键列就不允许出现空值,否则就失去了唯一标识一条记录的作用。空值( NULL)约束只能用于定义列约束。
创建空值( NULL)约束常用的操作方法有如下两种:
( 1)在 SQL Server管理平台中添加空值( NULL)约束;
( 2)使用 Transact-SQL语句设置空值( NULL)约束。
5.2.2 创建约束
6,空值( NULL)约束
( 1)在 SQL Server管理平台中添加空值( NULL)约束。如图
5-14所示。
图 5-14设置空值( NULL)约束对话框
5.2.2 创建约束
6,空值( NULL)约束
( 2)使用 Transact-SQL语句设置空值( NULL)约束,其语法形式如下:
[CONSTRAINT <约束名 > ][NULL|NOT NULL]
例 5-13 建立一个 S表,对 SNO字段进行 NOT NULL约束。
程序清单如下:
CREATE TABLE S
(SNO CHAR(10) CONSTRAINT S_CONS NOT NULL,
SN VARCHAR(20),
AGE INT,
SEX CHAR(2) DEFAULT ’男’,
DEPT VARCHAR(20))
5.2.3 修改表当数据库中的表创建完成后,可以根据需要改变表中原先定义的许多选项,以更改表的结构。用户可以增加、删除和修改列,增加、删除和修改约束,更改表名以及改变表的所有者等。
1、修改列属性修改列属性包括以下一些内容:
( 1)修改列的数据类型;
( 2)修改列的数据长度;
( 3)修改列的精度;
( 4)修改列的小数位数;
( 5)修改列的为空性。
5.2.3 修改表
2、添加和删除列在 SQL Server 2005中,如果列允许空值或对列创建 DEFAULT 约束,则可以将列添加到现有表中。将新列添加到表时,SQL Server 2005数据库引擎在该列为表中的每个现有数据行插入一个值。因此,在向表中添加列时向列添加 DEFAULT定义会很有用。如果新列没有 DEFAULT定义,则必须指定该列允许空值。数据库引擎将空值插入该列,如果新列不允许空值,则返回错误。
反之,可以删除现有表中的列,但具有下列特征的列不能被删除:
( 1)用于索引;
( 2)用于 CHECK,FOREIGN KEY,UNIQUE 或 PRIMARY KEY约束;
( 3)与 DEFAULT 定义关联或绑定到某一默认对象;
( 4)绑定到规则;
( 5)已注册支持全文;
( 6)用作表的全文键。
5.2.3 修改表
3、增加、修改和删除约束
( 1)增加、修改和删除 PRIMARY KEY 约束。
( 2)增加、修改和删除 UNIQUE约束。
( 3)增加、修改和删除 CHECK约束。
( 4)增加、修改和删除 DEFAULT约束。
( 5)增加、修改和删除 FOREIGN KEY约束。
( 6)增加和修改标识符列。只能为每个表创建一个标识符列和一个 GUID 列。
5.2.3 修改表例 5-14 创建一个雇员信息表,然后在表中增加一个 salary字段,删除表中的 age字段,并且修改 memo字段的数据类型。
SQL语句的程序清单如下:
create table employees(
id char( 8) primary key,
name char( 20) not null,
department char( 20) null,
memo char( 30) null,
age int null,
)
alter table employees
add salary int null,
drop column age,
alter column memo varchar( 200) null
5.2.3 修改表例 5-15 在 S表中增加一个班号列和住址列。
SQL语句的程序清单如下:
ALTER TABLE S
ADD
CLASS_NO CHAR(6),
ADDRESS CHAR(40)
注意:使用此方式增加的新列自动填充 NULL值,所以不能为增加的新列指定 NOT NULL约束。
例 5-16 在 SC表中增加完整性约束定义,使 SCORE在 0-100之间。
SQL语句的程序清单如下:
ALTER TABLE SC
ADD
CONSTRAINT SCORE_CHK CHECK(SCORE BETWEEN 0 AND 100)
5.2.4 查看表当在数据库中创建了表后,有时需要查看表的有关信息 。 比如表的属性,
定义,数据,字段属性和索引等 。 尤其重要的是查看表内存放的数据,另外有时需要查看表与其他数据库对象之间的依赖关系 。
1,查看表的定义,如图 5-15,5-16所示 。
图 5-15 选择表格属性对话框 图 5-16 表格属性对话框
5.2.4 查看表
2,查看表中存储的数据,如图 5-17,5-18所示 。
图 5-17 选择打开表对话框 图 5-18 显示表格数据对话框
5.2.4 查看表
3,查看表与其他数据库对象的依赖关系,如图 5-19所示 。
图 5-19 显示相关性对话框
5.2.4 查看表
4,利用系统存储过程查看表的信息系统存储过程 Sp_help可以提供指定数据库对象的信息,也可以提供系统或者用户定义的数据类型的信息,其语法形式如下:
sp_help [[@objname=]name]
例 5-17 ( 1)显示当前数据库中所有对象的信息;( 2)显示表
Person.Contact 的信息。在 SQL Server管理平台的查询窗口中,它们对应的语句和运行结果如图 5-20和图 5-21所示图 5-20 所有数据库对象显示窗口 图 5-21 当前数据库对象显示窗口
5.2.5 删除表
1,利用管理平台删除表在 SQL Server管理平台中,展开指定的数据库和表,右击要删除的表,从弹出的快捷菜单中选择“删除”选项,则出现除去对象对话框,如图 5-25所示。
图 5-25 删除表对话框
5.2.5 删除表
2,利用 DROP TABLE语句删除表
DROP TABLE语句可以删除一个表和表中的数据及其与表有关的所有索引、触发器、约束、许可对象。
DROP TABLE语句的语法形式如下:
DROP TABLE table_name
要删除的表如果不在当前数据库中,则应在 table_name中指明其所属的数据库和用户名。在删除一个表之前要先删除与此表相关联的表中的外部关键字约束。当删除表后,绑定的规则或者默认值会自动松绑。
例 5-18 删除 company数据库中的表 employee。
程序如下:
drop table company.dbo.employee
5.3 索引操作索引是数据库随机检索的常用手段,它实际上就是记录的关键字与其相应地址的对应表。通过索引可大大提高查询速度。此外,在 SQL SERVER中,行的唯一性也是通过建立唯一索引来维护的。
使用索引可以大大提高系统的性能,其具体表现在:
( 1)通过创建惟一索引,可以保证数据记录的惟一性。
( 2)可以大大加快数据检索速度。
( 3)可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。
( 4)在使用 ORDER BY和 GROUP BY子句进行检索数据时,
可以显著减少查询中分组和排序的时间。
( 5)使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能
5.3.1 创建索引
SQL Server 2005提供了如下几种创建索引的方法:
1,利用 SQL Server管理平台创建索引;
2,利用 Transact-SQL语句中的 CREATE
INDEX命令创建索引。
另外,可以在创建表的 PRIMARY KEY或
UNIQUE约束时自动创建索引。
5.3.1 创建索引
1.利用 SQL Server管理平台创建索引。
(1)展开指定的服务器和数据库,选择要创建索引的表,展开该表,选择“索引”选项(如图
5-26所示),右键单击索引,从弹出的快捷菜单中选择“新建索引”,就会出现新建索引对话框,如图 5-27所示。
图 5-26 选择新建索引选项对话框 图 5-27 创建索引对话框
5.3.1 创建索引
1.利用 SQL Server管理平台创建索引。
( 2)点击“添加”按钮,可选择用于创建索引的字段,如图 5-28所示。
( 3)打开创建索引对话框的选项页框,在此还可以设定索引的属性,如图 5-29所示。
图 5-28 选择用于创建索引的字段 图 5-29 索引对话框的选项页框
5.3.1 创建索引
2.利用 Transact-SQL语句中的 CREATE INDEX命令创建索引
CREATE INDEX命令既可以创建一个可改变表的物理顺序的聚集索引,也可以创建提高查询性能的非聚集索引,其语法形式如下:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
INDEX index_name ON { table | view } ( column [ ASC | DESC ]
[,...n ] )
[with
[PAD_INDEX]
[[,]FILLFACTOR=fillfactor]
[[,]IGNORE_DUP_KEY]
[[,]DROP_EXISTING]
[[,]STATISTICS_NORECOMPUTE]
[[,]SORT_IN_TEMPDB]
]
[ ON filegroup ]
5.3.1 创建索引
2.利用 Transact-SQL语句中的 CREATE INDEX命令创建索引例 5-19 为表 employees创建了一个惟一聚集索引。
程序清单如下:
CREATE UNIQUE CLUSTERED INDEX number_ind
ON employees ( number)
with
pad_index,
fillfactor=20,
ignore_dup_key,
drop_existing,
statistics_norecompute
5.3.2 查看、修改和删除索引
1.利用 SQL Server管理平台查看、修改和删除索引。
( 1)在 SQL Server管理平台中,展开指定的服务器和数据库项,并展开要查看的表,从选项中选择“索引”选项,则会出现表中已存在的索引列表。双击某一索引名称,则出现索引属性对话框,如图 5-30所示。索引碎片管理页框如图 5-31所示。
图 5-30 索引属性对话框 图 5-31 索引碎片数据管理对话框
5.3.2 查看、修改和删除索引
1.利用 SQL Server管理平台查看、修改和删除索引。
( 2)扩展属性对话框,如图 5-32所示,主要包含数据库名称,校对模式等。
通过右键单击索引名称,选择“创建索引脚本到新的查询分析器窗口”,则可以查看创建索引的 SQL脚本语句,如图 5-33所示。
图 5-32 索引扩展属性对话框 图 5-33 索引的 SQL脚本对话框
5.3.2 查看、修改和删除索引
2,用系统存储过程查看和更改索引名称系统存储过程 sp_helpindex可以返回表的所有索引信息,其语法形式如下;
sp_helpindex [@objname=]’name’
其中,[@objname=]’name’参数用于指定当前数据库中的表的名称。
另外,系统存储过程 sp_rename可以用来更改索引的名称,其语法形式如下:
sp_rename[@objname=]'object_name',
[@newname=]'new_name'
[,[ @objtype = ] 'object_type' ]
5.3.2 查看、修改和删除索引
2,用系统存储过程查看和更改索引名称例 5-21 使用系统存储过程 sp_helpindex 来查看表 authors的索引信息。
运行结果如下图所示。
例 5-22 将 employees表中的索引名称 employees_name_index名称更改为 employees _name_ind。
程序清单如下:
exec sp_rename ‘employees.[employees_name_index]’,
‘employees_name_ ind’,‘index’
5.3.2 查看、修改和删除索引
3.使用 Transact-SQL语句中的 DROP INDEX命令删除索引
当不再需要某个索引时,可以将其删除,DROP INDEX命令可以删除一个或者多个当前数据库中的索引,其语法形式如下:
DROP INDEX 'table.index | view.index' [,...n ]
其中,table | view用于指定索引列所在的表或索引视图; index用于指定要删除的索引名称。
例 5-23 删除表 employees中的索引 employees_name_index。
程序清单如下:
drop index employees.employees_name_index