创建新表

前面说过，数据库中的所有数据存储在表中。数据表包括行和列。列决定了表中数据的类型。行包含了实际的数据。

例如，数据库pubs中的表authors有九个字段。其中的一个字段名为为au_lname，这个字段被用来存储作者的名字信息。每次向这个表中添加新作者时，作者名字就被添加到这个字段，产生一条新记录。

通过定义字段，你可以创建一个新表。每个字段有一个名字和一个特定的数据类型（数据类型在后面的“字段类型”一节中讲述），例如字段au_lname存储的是字符型数据。一个字段也可以存储其它类型的数据。

使用SQL Sever，创建一个新表的方法是很多的。你可以可执行一个SQL语句或使用SQL事务管理器（SQL Enterprise Manager）来创建一个新表。在下一节里，你将学会如何用SQL语句来创建一个新表。

用SQL创建新表

注意

如果你还没有建立自己的数据库，现在就跳回到第三章创建这个库。你绝不能向master,tempdb或任何其他任何系统数据库中添加数据。

从SQL Sever程序组（在任务栏中）中启动ISQL/w程序。出现查询窗口后，从窗口顶部的下拉列表中选择你在第三章所创建的数据库。下一步，在查询窗口中键入下面的SQL语句，单击执行查询按钮，执行这个语句：

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate

DATETIME)

如果一切正常，你会在结果窗口中看到如下的文字（如果出现异常，请参阅第三章）：

This command dit not return data ,and it did not return any rows

祝贺你，你已经建立了你的第一个表！

你所创建的表名为guestbook，你可以使用这个表来存储来字你站点访问者的信息。你是用REEATE TABLE语句创建的这个表，这个语句有两部分：第一部份指定表的名子；第二部份是括在括号中的各字段的名称和属性，相互之间用逗号隔开。

表guestbook有三个字段：visitor,comments 和entrydate。visitor字段存储访问者的名字，comments字段存储访问者对你站点的意见，entrydate字段存储访问者访问你站点的日期和时间。

注意每个字段名后面都跟有一个专门的表达式。例如，字段名comments后面跟有表达式TEXT。这个表达式指定了字段的数据类型。数据类型决定了一个字段可以存储什么样的数据。因为字段comments包含文本信息，其数据类型定义为文本型。

字段有许多不同的数据类型。下一小节讲述SQL所支持的一些重要的数据类型。

字段类型

不同的字段类型用来存放不同类型的数据。创建和使用表时，更你应该理解五种常用的字段类型：字符型，文本型，数值型，逻辑性和日期型。

字符型数据

字符型数据非常有用。当你需要存储短的字符串信息时，你总是要用到字符型数据。例如，你可以把从HTML form的文本框中搜集到的信息放在字符型字段中。

要建立一个字段用来存放可变长度的字符串信息，你可以使用表达式 VARCHAR。考虑你前面创建的表guestbook：

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate

DATETIME)

在这个例子中，字段visitor的数据类型为VARCHAR。注意跟在数据类型后面的括号中的数字。这个数字指定了这个字段所允许存放的字符串的最大长度。在这个例子中，字段visitor能存放的字符串最长为四十个字符。如果名字太长，字符串会被截断，只保留四十个字符。

VARCHAR类型可以存储的字符串最长为255个字符。要存储更长的字符串数据，可以使用文本型数据（下一节中讲述）。

另一种字符型数据用来存储固定长度的字符数据。下面是一个使用这种数据类型的例子：

CREATE TABLE guestbook (visitor CHAR(40),comments TEXT,entrydate

DATETIME)

在这个例子中，字段visitor被用来存储四十个字符的固定长度字符串。表达式CHAR指定了这个字段应该是固定长度的字符串。

VARCHAR型和CHAR型数据的这个差别是细微的，但是非常重要。假如你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates。当你以后从这个字段中取出此数据时，你取出的数据其长度为十个字符——字符串Bill Gates的长度。

现在假如你把字符串输入一个长度为四十个字符的CHAR型字段中，那么当你取出数据时，所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。

当你建立自己的站点时，你会发现使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段时，你不需要为剪掉你数据中多余的空格而操心。

VARCHAR型字段的另一个突出的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大时，这种内存和磁盘空间的节省会变得非常重要。

文本型数据

字符型数据限制了字符串的长度不能超过２55个字符。而使用文本型数据，你可以存放超过二十亿个字符的字符串。当你需要存储大串的字符时，应该使用文本型数据。

这里有一个使用文本型数据的例子：

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate

DATETIME)

在这个例子中，字段comments被用来存放访问者对你站点的意见。注意文本型数据没有长度，而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据通常要么为空，要么很大。

当你从HTML form的多行文本编辑框（TEXTAREA）中收集数据时，你应该把收集的信息存储于文本型字段中。但是，无论何时，只要你能避免使用文本型字段，你就应该不适用它。文本型字段既大且慢，滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。

警告

一旦你向文本型字段中输入了任何数据（甚至是空值），就会有2K的空间被自动分配给该数据。除非删除该记录，否则你无法收回这部分存储空间。

数值型数据

SQL Sever支持许多种不同的数值型数据。你可以存储整数、小数、和钱数。

通常，当你需要在表中的存放数字时，你要使用整型（INT）数据。INT型数据的表数范围是从-2，147，483，647到2，147，483，647的整数。下面是一个如何使用INT型数据的例子：

CREATE TABLE visitlog (visitor VARCHAR(40),numvisits INT)

这个表可以用来记录你站点被访问的次数。只要没有人访问你的站点超过2，147，483，647次，nubvisits字段就可以存储访问次数。

为了节省内存空间，你可以使用SMALLINT型数据。SMALLINT 型数据可以存储从-32768到32768的整数。这种数据类型的使用方法与INT型完全相同。

最后，如果你实在需要节省空间，你可以使用TINYINT型数据。同样，这种类型的使用方法也与INT型相同，不同的是这种类型的字段只能存储从０到255的整数。TINYINT型字段不能用来存储负数。

通常，为了节省空间，应该尽可能的使用最小的整型数据。一个TINYINT型数据只占用一个字节；一个INT型数据占用四个字节。这看起来似乎差别不大，但是在比较大的表中，字节数的增长是很快的。另一方面，一旦你已经创建了一个字段，要修改它是很困难的。因此，为安全起见，你应该预测以下，一个字段所需要存储的数值最大有可能是多大，然后选择适当的数据类型。

为了能对字段所存放的数据有更多的控制，你可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数——比INT型数据要大得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如，你可以在NUMERIC型字段中存储小数3.14。

当定义一个NUMERIC型字段时，你需要同时指定整数部分的大小和小数部分的大小。这里有一个使用这种数据类型的例子：

CREATE TABLE numeric_data (bignumber NUMERIC(28,0),

fraction NUMERIC (5,4) )

当这个语句执行时，将创建一个名为numeric_data的包含两个字段的表。字段bignumber可以存储直到28位的整数。字段fraction可以存储有五位整数部分和四位小数部分的小数。

一个NUMERIC型数据的整数部分最大只能有28位，小数部分的位数必须小于或等于整数部分的位数，小数部分可以是零。

你可以使用INT型或NUMERIC型数据来存储钱数。但是，专门有另外两种数据类型用于此目的。如果你希望你的网点能挣很多钱，你可以使用MONEY型数据。如果你的野心不大，你可以使用SMALLMONEY型数据。MONEY型数据可以存储从-922，337，203，685，477.5808到922，337，203，685，477.5807的钱数。如果你需要存储比这还大的金额，你可以使用NUMERIC型数据。

SMALLMONEY型数据只能存储从-214，748.3648到214，748.3647 的钱数。同样，如果可以的话，你应该用SMALLMONEY型来代替MONEY型数据，以节省空间。下面的例子显示了如何使用这两种表示钱的数据类型：

CREATE TABLE products (product VARCHAR(40),price MONEY,

Discount_price SMALLMONEY)

这个表可以用来存储商品的折扣和普通售价。字段price 的数据类型是MONEY，字段discount_price的数据类型是SMALLMONEY。

存储逻辑值

如果你使用复选框（CHECKBOX）从网页中搜集信息，你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值：0或1。这里有一个如何使用这种字段的例子：

CREATE TABLE opinion (visitor VARCHAR(40),good BIT)

这个表可以用来存放对你的网点进行民意调查所得的信息。访问者可以投票表示他们是否喜欢你的网点。如果他们投YES，就在BIT型字段中存入1。反之，如果他们投NO，就在字段中存入0（在下一章里，你将学会如何计算投票）。

当心，在你创建好一个表之后，你不能向表中添加BIT型字段。如果你打算在一个表中包含BIT型字段，你必须在创建表时完成。

存储日期和时间

当你建立一个网点时，你也许需要记录在一段时间内的访问者数量。为了能够存储日期和时间，你需要使用DATETIME型数据，如下例所示：

CREATE TABL visitorlog( visitor VARCHAR (40), arrivaltime DATETIME ,

departuretime DATETIME)

这个表可以用来记录访问者进入和离开你网点的时间和日期。一个DATETIME型的字段可以存储的日期范围是从１７５３年１月１日第一毫秒到9999年12月31日最后一毫秒。

如果你不需要覆盖这么大范围的日期和时间，你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用，只不过它能表示的日期和时间范围比DATETIME型数据小，而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从１９00年１月１日到２０７９年６月６日的日期，它只能精确到秒。

DATETIME型字段在你输入日期和时间之前并不包含实际的数据，认识这一点是重要的。在下一章，你将学习怎样使用大量的SQL函数来读取和操作日期和时间（参见下面的“缺省值”一节）。你也可以在VBScript和JScript 中使用日期和时间函数来向一个DATETIME型字段中输入日期和时间。