专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » 操作数据:SQL基础 »正文

操作数据:SQL基础

来源: 发布时间:星期日, 2008年12月28日 浏览:2次 评论:0
="t18">本章内容

SQL介绍
使用SELECT 语句从表中取数据
创建新表
字段属性
向表中添加数据
删除和修改表


为了建立交互站点你需要使用数据库来存储来自访问者信息例如你要建立个职业介绍服务站点你就需要存储诸如个人简历所感兴趣工作等等这样信息创建动态网叶也需要使用数据库如果你想显示符合来访者要求最好工作你就需要从数据库中取出这份工作信息你将会发现在许多情况下需要使用数据库
在这章里你将学会怎样使用“结构化查询语言”(SQL〕来操作数据库SQL语言是数据库标准语言在Active Sever Pages 中无论何时你要访问个数据库你就要使用SQL语言因此掌握好SQL对ASP编程是非常重要

注意:
你可以把“SQL”读作“sequel”也可以按单个字母读音读作S-Q-L 两种发音都是正确每种发音各有大量支持者在本书里认为“SQL”读作“sequel”

通过这学习你将理解怎样用SQL实现数据库查询你将学会怎样使用这种查询从数据表中取出信息最后你将学会怎样设计和建立自己数据库

注意:
通过下面几章对SQL介绍你将对SQL有足够了解从而可以有效地使用Active Sever Pages但是SQL是种复杂语言本书不可能包括它全部细节要全面掌握SQL语言你需要学习在Microsoft SQL Sever 中使用SQL你可以到附近书店去买本Microsoft SQL Sever 6.5

SQL介绍:
本书假设你是在SQL操作Microsoft SQL Sever 数据库你也可以用SQL操作许多其它类型数据库SQL是操作数据库标准语言(事实上有关SQL语言有个专门ANSI标准〕

注意:
不要在你站点上试图用Microsoft Access代替Microsoft SQL SeverSQL Sever可以同时服务于许多用户如果你希望你站点有较高访问率MS Access是不能胜任

在学习SQL细节的前你需要理解它两大特点个特点容易掌握个掌握起来有点困难
个特点是所有SQL数据库中数据都存储在表中个表由行和列组成例如下面这个简单表包括name 和e-mail address:
Name Email Address
................................................................
Bill Gates [email protected]
president Clon [email protected]
Stephen Walther [email protected]
这个表有两列(列也称为字段域〕:Name和Email Address有 3行行包含组数据行中数据组合在起称为条记录
无论何时你向表中添加新数据你就添加了条新记录个数据表可以有几十个记录也可以有几千甚至几十亿个记录虽然你也许永远不需要存储十亿个Email地址但知道你能这样做总是好也许有天你会有这样需要
数据库很有可能包含几十个表所有存储在你数据库中信息都被存储在这些表中当你考虑怎样把信息存储在数据库中时你应该考虑怎样把它们存储在表中
SQL第 2个特点有些难于掌握这种语言被设计为不允许你按照某种特定顺序来取出记录这样做会降低SQL Sever取记录效率使用SQL你只能按查询条件来读取记录
当考虑如何从表中取出记录时自然会想到按记录位置读取它们例如也许你会尝试通过个循环逐个记录地扫描来选出特定记录在使用SQL时你必须训练自己不要有这种思路
假如你想选出所有名字是“Bill Gates”记录如果使用传统编程语言你也许会构造个循环逐个查看表中记录看名字域是否是“Bill Gates”
这种选择记录思路方法是可行但是效率不高使用SQL你只要说“选择所有名字域等于Bill Gates记录”SQL就会为你选出所有符合条件记录SQL会确定实现查询最佳思路方法
建设你想取出表中前十个记录使用传统编程语言你可以做个循环取出前十个记录后结束循环但使用标准SQL查询这是不可能实现从SQL角度来说个表中不存在前十个记录这种概念
开始时当你知道你不能用SQL实现某些你感觉应该能实现功能你会受到挫折你也许会以头撞墙甚至想写恶毒信件给SQL设计者们但后来你会认识到SQL这个特点不仅不是个限制反而是其长处SQL不根据位置来读取记录它读取记录可以很快
综上所述SQL有两个特点:所有数据存储在表中从SQL角度来说表中记录没有顺序在下你将学会怎样用SQL从表中选择特殊记录

使用SQL从表中取记录
SQL主要功能的是实现数据库查询如果你熟悉Internet 引擎那么你已经熟悉查询了你使用查询来取得满足特定条件信息例如如果你想找到有ASP信息全部站点你可以连接到 Yahoo!并执行个对Active Sever Pages搜索在你输入这个查询后你会收到个列表表中包括所有其描述中包含搜索表达式站点
多数Internet 引擎允许逻辑查询在逻辑查询中你可以包括特殊运算符如AND、OR和NOT你使用这些运算符来选择特定记录例如你可以用AND来限制查询结果如果你执行个对Active Sever Pages AND SQL搜索你将得到其描述中同时包含Active Sever Pages 和SQL记录当你需要限制查询结果时你可以使用AND
如果你需要扩展查询结果你可以使用逻辑操作符OR例如如果你执行个搜索搜索所有其描述中包含Active Sever Pages OR SQL站点你收到列表中将包括所有其描述中同时包含两个表达式或其中任何个表达式站点
如果你想从搜索结果中排除特定站点你可以使用NOT例如查询“Active Sever Pages ”AND NOT “SQL”将返回个列表列表中站点包含Active Sever Pages但不包含SQL当必须排除特定记录时你可以使用NOT
用SQL执行查询和用Internet搜索引擎执行搜索非常相似 当你执行个SQL查询时通过使用包括逻辑运算符查询条件你可以得到个记录列表此时查询结果是来自个或多个表
SQL查询句法非常简单假设有个名为email_table 包含名字和地址两个字段要得到Bill Gates e_mail地址,你可以使用下面查询:

SELECT email from email_table WHERE name="Bill Gates"

当这个查询执行时就从名为email_table表中读取Bill Gatese_mail 地址这个简单语句包括 3部分:
■ SELECT语句部分指名要选取在此例中只有email列被选取当执行 时只显示email列[email protected]
■ SELECTT语句第 2部份指明要从哪个(些)表中查询数据在此例中要查询表名为email_table
■ 最后SELECT语句WHERE子句指明要选择满足什么条件记录在此例中查询条件为只有name列值为Bill Gates 记录才被选取
Bill Gates很有可能拥有不止个email地址如果表中包含Bill Gates多个email地址用上述SELECT语句可以读取他所有email地址SELECT语句从表中取出所有name字段值为Bill Gates 记录email 字段
前面说过查询可以在查询条件中包含逻辑运算符假如你想读取Bill Gates 或Clon总统所有email地址你可以使用下面查询语句:

SELECT email FROM email_table WHERE name="Bill Gates" OR
name="president Clon"

此例中查询条件比前个复杂了这个语句从表email_table中选出所有name列为Bill Gates或president Clon记录如果表中含有Bill Gates或president Clon多个地址所有地址都被读取
SELECT语句结构看起来很直观如果你请个朋友从个表中为你选择组记录你也许以非常相似方式提出你要求在SQL SELECT语句中你“SELECT特定列FROM个表WHERE某些列满足个特定条件”
节将介绍怎样执行SQL查询来选取记录这将帮助你熟悉用SELECT语句从表中取数据各种区别思路方法

使用ISQL执行SELECT查询
当你安装SQL Sever时你同时安装了个叫作ISQL/w应用ISQL/w允许你执行交互SQL查询在把查询包括到你ASP网页中的前用ISQL/w对其进行测试是非常有用

注意:
在这本书部份你学习了怎样安装和配置Microsoft SQL Sever 如果没有安装SQL Sever或者SQL Sever不能运行请参阅第 3章“安装和使用SQL Sever”

选择任务上SQL Sever组中ISQL_w以启动该启动时首先会出现个对话框要求输入服务器信息和登录信息(见图10.1)在Sever框中输入你SQL服务器名字如果服务器正运行在本地计算机上服务器名字就是你计算机名字在登录信息框中输入个登录帐号和密码或选择使用“可信连接”然后单击Connect按钮

图101



注意:
如果你将SQL Sever配置为使用完整安全或混合安全那么你可以使用可信连接如果你使用标准安全你则需要提供用户帐号和密码要了解更多信息参见第 3章

如果切正常在你单击连接按钮后会出现个查询窗口如图10.2所示(如果有异常请参考第 3章)


图10.2


在执行查询的前你需要选择数据库安装 SQL Sever时你已为自己创建了个数据库SQL Sever还有许多系统数据库如mastermodelmsdb和tempdb
方便SQL Sever带有个特殊名为pubs例子数据库库 pubs中包含供个虚拟出版商使用各个表文档中所有例子都是针对这个库来设计本书中许多例子也使用这个数据库
在查询窗口顶部DB下拉框中选择数据库pubs这样你就选择了数据库你所有查询都将针对这个库中各个表来执行现在你可以执行你个查询了这真让人兴奋!
个查询将针对个名为autrors表中包含所有为某个虚拟出版商工作作者相关数据单击查询窗口并输入以下语句:

SELECT phone FROM authors WHERE au_name="Ringer"

输入完成后单击执行查询按钮(个绿色 3角形看起来像VCR播放键)单击此按钮后任何出现在查询窗口中语句均会被执行查询窗口会自动变成结果显示窗口你可以看到查询结果(见图10.3)
你看到查询结果也许和图10.3所示区别在SQL Sever区别版本中库pubs中数据会有所区别对SQL Sever 6.5来说将会找到两条记录结果显示窗口中应显示如下内容:

phone
……………….
801 826_0752
801 826_0752
(2 row(s) affected)



图10.3



你所执行SELECT语句从表authors中取出所有名字为Ringer作者电话号码你通过在WHERE子句中使用特殊选择条件来限制查询结果你也可以忽略选择条件从表中取出所有作者电话号码要做到这单击Query标签返回到查询窗口输入以下SELECT语句:

SELECT Phone FROM authors
这个查询执行后会取出表authors中所有电话号码(没有特定顺序)如果表authors中包含百个电话号码会有百个记录被取出如果表中有十亿个电话号码这十亿条记录都会被取出(这也许需要些时间)
表authrs字段包括姓名字电话号码地址城市州和邮政编码通过在SELECT语句部份指定它们你可以从表中取出任何个字段你可以在个SELECT语句中次取出多个字段比如:

SELECT au_fname ,au_lname, phone FROM authors

这个SELECT语句执行后将取出这 3个列所有值下面是这个查询结果个举例(为了节省纸张只显示查询结果部分其余记录用省略号代替):

au_fname au_lname phone
………………………………………………………………………….
Johnson White 408 496_7223
Marjorie Green 415 986_7020
Cheryl Carson 415 548_7723
Michael O’Leary 408 286_2428

(23 row(s) affected)

在SELECT语句中你需要列出多少个字段你就可以列出多少不要忘了把字段名用逗号隔开你也可以用星号(*)从个表中取出所有字段这里有个使用星号例子:

SELECT * FROM authors

这个SELECT语句执行后表中所有字段值都被取出你会发现你将在SQL查询中频繁使用星号

窍门技巧:
你可以使用星号来查看个表所有列名字要做到这只需要在执行完SELECT语句后看下查询结果列标题

操作多个表
到现在为止你只尝试了用句SQL查询从个表中取出数据你也可以用个SELECT语句同时从多个表中取出数据只需在SELECT语句FROM从句中列出要从中取出数据表名称即可:

SELECT au_lname ,title FROM authors, titles

这个SELECT语句执行时同时从表authors和表titles中取出数据从表authors中取出所有作者名字从表titles中取出所有书名在ISQL/w中执行这个查询下查询结果你会发现些奇怪出乎意料情况:作者名字并没有和它们所著书相匹配而是出现了作者名字和书名所有可能组合这也许不是你所希望见到
出了什么差错?问题在于你没有指明这两个表的间关系你没有通过任何方式告诉SQL如何把表和表关联在由于不知道如何关联两个表服务器只能简单地返回取自两个表中记录所有可能组合
要从两个表中选出有意义记录组合你需要通过建立两表中字段关系来关联两个表要做到这途径的是创建第 3个表专门用来描述另外两个表字段的间关系
表authors有个名为au_id字段包含有每个作者标识表titles有个名为title_id字段包含每个书名标识如果你能在字段au_id和字段title_id 的间建立个关系你就可以关联这两个表数据库pubs中有个名为titleauthor正是用来完成这个工作表中每个记录包括两个字段用来把表titles和表authors关联在下面SELECT语句使用了这 3个表以得到正确结果:

SELECT au_name,title FROM authors,titles,titleauthor
WHERE authors.au_id=titleauthor.au_id
AND titles.title_id=titleauthor.title_id

当这个SELECT语句执行时每个作者都将和正确书名相匹配表titleauthor指明了表authors和表titles关系它通过包含分别来自两个表个字段实现这第 3个表是在另外两个表字段的间建立关系它本身不包含任何附加数据
注意在这个例子中字段名是如何书写为了区别表authors和表titles中相同字段名au_id每个字段名前面都加上了表名前缀和个句号名为author.au_id 字段属于表authors名为titleauthor.au_id字段属于表titleauthor两者不会混淆
通过使用第 3个表你可以在两个表字段的间建立各种类型关系例如个作者也许写了许多区别或者本书也许由许多区别作者共同完成当两个表字段的间有这种“多对多”关系时你需要使用第 3个表来指明这种关系
但是在许多情况下两个表的间关系并不复杂比如你需要指明表titles和表publishers的间关系个书名不可能和多个出版商相匹配你不需要通过第 3个表来指明这两个表的间关系要指明表titles和表publishers的间关系你只要让这两个表有个公共字段就可以了在数据库pubs中表titles和表publishers都有个名为pub_id字段如果你想得到书名及其出版商个列表你可以使用如下语句:
SELECT title,pub_name FROM titles,publishers
WHERE titles.pub_id=publishers.pub_id

当然如果本书是由两个出版商联合出版那么你需要第 3个表来代表这种关系
通常当你予先知道两个表字段间存在“多对多”关系时就使用第 3个表来关联这两个表反的如果两个表字段间只有“”或“对多”关系你可以使用公共字段来关联它门

操作字段
通常当你从个表中取出字段值时该值和创建该表时所定义字段名联系在如果你从表authors中选择所有作者名字所有值将会和字段名au_lname相联系但是在某些情况下你需要对字段名进行操作在SELECT语句中你可以在缺省字段名后面仅跟个新名字来取代它例如可以用个更直观易读名字Author Last Name来代替字段名au_lname:

SELECT au_lname "Author Last Name" FROM authors

当这个SELECT语句执行时来自字段au_lname值会和“Author Last Name”相联系查询结果可能是这样:

Author Last Name
……………………………………………………………………..
White
Green
Carson
O’Leary
Straight

(23 row(s) affected)

注意字段标题不再是au_lname而是被Author Last Name所取代
你也可以通过执行运算来操作从个表返回字段值例如如果你想把表titles中所有书价格加倍你可以使用下面SELECT语句:

SELECT price*2 FROM titles

当这个查询执行时每本书价格从表中取出时都会加倍但是通过这种途径操作字段不会改变存储在表中书价对字段运算只会影响SELECT语句输出而不会影响表中数据为了同时显示书原始价格和涨价后新价格你可以使用下面查询:

SELECT price "Original price", price*2 "New price" FROM titles

当数据从表titles中取出时原始价格显示在标题Original price下面加倍后价格显示在标题New price下面结果可能是这样:

original price price
……………………………………………………………….
19.99 39.98
11.95 23.90
2.99 5.98
19.99 39.98

(18 row(s) affected)

你可以使用大多数标准数学运算符来操作字段值如加(+)减(-)乘(*)和除(/)你也可以次对多个字段进行运算例如:

SELECT price*ytd_sales "total revenue" FROM titles

在这个例子中通过把价格和销售量相乘计算出了每种书总销售额这个SELECT语句结果将是这样:

total revenue
……………………………………………..
81,859,05
46,318,20
55,978,78
81,859,05
40,619,68

(18 row(s) affected)

最后你还可以使用连接运算符(它看起来像个加号)来连接两个型字段:

SELECT au_fname+" "+au_lname "author name" FROM authors

在这个例子中你把字段au_fname和字段au_lname粘贴在中间用个逗号 隔开并把查询结果标题指定为author name这个语句执行结果将是这样:

author names
…………………………………………………………
Johnson White
Marjorie Green
Cheryl Carson
Michael O’Leary
Dean Straight

(23 row(s) affected)

可以看到SQL为你提供了对查询结果许多控制你应该在ASP编程过程中充分利用这些优点使用SQL来操作查询结果几乎总是比使用有同样作用脚本效率更高

排序查询结果
本章介绍中曾强调过SQL表没有内在顺序例如个表中取第 2个记录是没有意义从SQL角度看来没有个记录在任何其他记录的前
然而你可以操纵个SQL查询结果顺序在缺省情况下当记录从表中取出时记录不以特定顺序出现例如当从表authors中取出字段au_lname时查询结果显示成这样:

au_lname
…………………………………….
White
Green
Carson
O’Leary
Straight

(23 row(s) affected)

列没有特定顺序名字是很不方便如果把这些名字按字母顺序排列读起来就会容易得多通过使用ORDER BY子句你可以强制个查询结果按升序排列就像这样:

SELECT au_lname FROM authors ORDER BY au_lname

当这个SELECT语句执行时作者名字显示将按字母顺序排列ORDER BY子句将作者名字按升序排列
你也可以同时对多个列使用ORDER BY子句例如如果你想同时按升序显示字段au_lname和字段au_fname你需要对两个字段都进行排序:

SELECT au_lname,au_fname FROM authors ORDER BY au_lname ,au_fname

这个查询首先把结果按au_lname字段进行排序然后按字段au_fname排序记录将按如下顺序取出:

au_lname au_fname
…………………………………………………………………….
Bennet Abraham
Ringer Albert
Ringer Anne
Smith Meander

(23 row(s) affected)

注意有两个作者有相同名字Ringer名为Albert Ringer作者出现名为Anne Ringer作者的前这是姓Albert按字母顺序应排在姓Anne的前
如果你想把查询结果按相反顺序排列你可以使用关键字DESC关键字DESC把查询结果按降序排列如下例所示:

SELECT au_lname,au_fname FROM authors
WHERE au_lname=”Ringer” ORDER BY au_lname ,au_fname DESC

这个查询从表authors中取出所有名字为Ringer作者记录ORDER BY子句根据作者名字和姓将查询结果按降序排列结果是这样:

au_lname au_fname
……………………………………………………………………………………….
Ringer Anne
Ringer Albert
(2 row(s) affectec)

注意在这个表中姓Anne出现在姓Albert的前作者名字按降序显示
你也可以按数值型字段对个查询结果进行排序例如如果你想按降序取出所有书价格你可以使用如下SQL查询:

SELECT price FROM titles ORDER BY price DESC

这个SELECT语句从表中取出所有书价格显示结果时价格低书先显示价格高书后显示

警告:
不是特别需要时不要对查询结果进行排序服务器完成这项工作要费些力气这意味着带有ORDER BY 子句SELECT语句执行起来比SELECT语句花时间长

取出互不相同记录
个表有可能在同列中有重复例如数据库pubs表authors中有两个作者名字是Ringer如果你从这个表中取出所有名字名字Ringer将会显示两次
在特定情况下你可能只有兴趣从个表中取出互不相同如果个字段有重复你也许希望每个值只被选取你可以使用关键字DISTINCT来做到这点:

SELCET DISTINCT au_lname FROM authors WHERE au_lname="Ringer"

当这个SELECT语句执行时只返回个记录通过在SELECT语句中包含关键字DISTINCT你可以删除所有重复例如假设有个有关新闻组信息发布你想取出所有曾在这个新闻组中发布信息名字那么你可以使用关键字DISTINCT每个用户名字只取次——尽管有用户发布了不止篇信息
警告:
如同ORDER BY子句强制服务器返回互不相同值也会增加运行开销福气不得不花费些时间来完成这项工作因此不是必须时候不要使用关键字DISTINCT

创建新表
前面说过数据库中所有数据存储在表中数据表包括行和列列决定了表中数据类型行包含了实际数据
例如数据库pubs中表authors有 9个字段其中个字段名为为au_lname这个字段被用来存储作者名字信息每次向这个表中添加新作者时作者名字就被添加到这个字段产生条新记录
通过定义字段你可以创建个新表每个字段有个名字和个特定数据类型(数据类型在后面“字段类型”节中讲述)例如字段au_lname存储型数据个字段也可以存储其它类型数据
使用SQL Sever创建个新表思路方法是很多你可以可执行个SQL语句或使用SQL事务管理器(SQL Enterprise Manager)来创建个新表在下节里你将学会如何用SQL语句来创建个新表

用SQL创建新表
注意:
如果你还没有建立自己数据库现在就跳回到第 3章创建这个库你绝不能向master,tempdb或任何其他任何系统数据库中添加数据

从SQL Sever组(在任务栏中)中启动ISQL/w出现查询窗口后从窗口顶部下拉列表中选择你在第 3章所创建数据库在查询窗口中键入下面SQL语句单击执行查询按钮执行这个语句:

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

如果切正常你会在结果窗口中看到如下文字(如果出现异常请参阅第 3章):

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

祝贺你你已经建立了你个表!
你所创建表名为guestbook你可以使用这个表来存储来字你站点访问者信息你是用REEATE TABLE语句创建这个表这个语句有两部分:第部份指定表名子;第 2部份是括在括号中各字段名称和属性相互的间用逗号隔开
表guestbook有 3个字段:visitor,comments 和entrydatevisitor字段存储访问者名字comments字段存储访问者对你站点意见entrydate字段存储访问者访问你站点日期和时间
注意每个字段名后面都跟有个专门表达式例如字段名comments后面跟有表达式TEXT这个表达式指定了字段数据类型数据类型决定了个字段可以存储什么样数据字段comments包含文本信息其数据类型定义为文本型
字段有许多区别数据类型小节讲述SQL所支持些重要数据类型

字段类型
区别字段类型用来存放区别类型数据创建和使用表时更你应该理解 5种常用字段类型:文本型数值型逻辑性和日期型

型数据
型数据非常有用当你需要存储短串信息时你总是要用到型数据例如你可以把从HTML form文本框中搜集到信息放在型字段中
要建立个字段用来存放可变长度串信息你可以使用表达式 VARCHAR考虑你前面创建表guestbook:

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

在这个例子中字段visitor数据类型为VARCHAR注意跟在数据类型后面括号中数字这个数字指定了这个字段所允许存放最大长度在这个例子中字段visitor能存放串最长为 4十个如果名字太长串会被截断只保留 4十个
VARCHAR类型可以存储串最长为255个要存储更长串数据可以使用文本型数据(下节中讲述)
型数据用来存储固定长度数据下面是个使用这种数据类型例子:

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

在这个例子中字段visitor被用来存储 4十个固定长度表达式CHAR指定了这个字段应该是固定长度
VARCHAR型和CHAR型数据这个差别是细微但是非常重要假如你向个长度为 4十个VARCHAR型字段中输入数据Bill Gates当你以后从这个字段中取出此数据时你取出数据其长度为十个——串Bill Gates长度
现在假如你把串输入个长度为 4十个CHAR型字段中那么当你取出数据时所取出数据长度将是 4十个后面会被附加多余空格
当你建立自己站点时你会发现使用VARCHAR型字段要比CHAR型字段方便使用VARCHAR型字段时你不需要为剪掉你数据中多余空格而操心
VARCHAR型字段个突出好处是它可以比CHAR型字段占用更少内存和硬盘空间当你数据库很大时这种内存和磁盘空间节省会变得非常重要

文本型数据
型数据限制了长度不能超过255个而使用文本型数据你可以存放超过 2十亿个当你需要存储大串应该使用文本型数据
这里有个使用文本型数据例子:

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

在这个例子中字段comments被用来存放访问者对你站点意见注意文本型数据没有长度而上节中所讲型数据是有长度个文本型字段中数据通常要么为空要么很大
当你从HTML form多行文本编辑框(TEXTAREA)中收集数据时你应该把收集信息存储于文本型字段中但是无论何时只要你能避免使用文本型字段你就应该不适用它文本型字段既大且慢滥用文本型字段会使服务器速度变慢文本型字段还会吃掉大量磁盘空间
警告:
旦你向文本型字段中输入了任何数据(甚至是空值)就会有2K空间被自动分配给该数据除非删除该记录否则你无法收回这部分存储空间

数值型数据
SQL Sever支持许多种区别数值型数据你可以存储整数、小数、和钱数
通常当你需要在表中存放数字时你要使用整型(INT)数据INT型数据表数范围是从-2147483647到2147483647整数下面是个如何使用INT型数据例子:

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

这个表可以用来记录你站点被访问次数只要没有人访问你站点超过2147483647次nubvisits字段就可以存储访问次数
为了节省内存空间你可以使用SMALLINT型数据SMALLINT 型数据可以存储从-32768到32768整数这种数据类型使用思路方法和INT型完全相同
最后如果你实在需要节省空间你可以使用TINYINT型数据同样这种类型使用思路方法也和INT型相同区别是这种类型字段只能存储从0到255整数TINYINT型字段不能用来存储负数
通常为了节省空间应该尽可能使用最小整型数据个TINYINT型数据只占用个字节;个INT型数据占用 4个字节这看起来似乎差别不大但是在比较大表中字节数增长是很快方面旦你已经创建了个字段要修改它是很困难因此为安全起见你应该预测以下个字段所需要存储数值最大有可能是多大然后选择适当数据类型
为了能对字段所存放数据有更多控制你可以使用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可以存储有 5位整数部分和 4位小数部分小数
个NUMERIC型数据整数部分最大只能有28位小数部分位数必须小于或等于整数部分位数小数部分可以是零
你可以使用INT型或NUMERIC型数据来存储钱数但是专门有另外两种数据类型用于此目如果你希望你网点能挣很多钱你可以使用MONEY型数据如果你野心不大你可以使用SMALLMONEY型数据MONEY型数据可以存储从-922337203685477.5808到922337203685477.5807钱数如果你需要存储比这还大金额你可以使用NUMERIC型数据
SMALLMONEY型数据只能存储从-214748.3648到214748.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型字段可以存储日期范围是从1753年1月1日第毫秒到9999年12月31日最后毫秒
如果你不需要覆盖这么大范围日期和时间你可以使用SMALLDATETIME型数据它和DATETIME型数据同样使用只不过它能表示日期和时间范围比DATETIME型数据小而且不如DATETIME型数据精确个SMALLDATETIME型字段能够存储从1900年1月1日到2079年6月6日日期它只能精确到秒
DATETIME型字段在你输入日期和时间的前并不包含实际数据认识这点是重要在下你将学习怎样使用大量SQL来读取和操作日期和时间(参见下面“缺省值”节)你也可以在VBScript和JScript 中使用日期和时间来向个DATETIME型字段中输入日期和时间

字段属性
节介绍了如何建立包含区别类型字段在这节中你将学会如何使用字段 3个属性这些属性允许你控制空值缺省值和标识值

允许和禁止空值
大多数字段可以接受空值(NULL)个字段接受了空值后如果你不改变它它将直保持空值空值(NULL)和零是区别严格空值表示没有任何值
为了允许个字段接受空值你要在字段定义后面使用表达式NULL例如下面表中两个字段都允许接受空值:

CREATE TABLE empty (empty1 CHAR (40) NULL,empty2 INT NULL(

注意:
BIT型数据不能是空值个这种类型字段必须取0或者1

有时你需要禁止个字段使用空值例如假设有个表存储着信用卡号码和信用卡有效日期你不会希望有人输入个信用卡号码但不输入有效日期为了强制两个字段都输入数据你可以用下面思路方法建立这个表:

CREATE TABLE creditcards (creditcard_number CHAR(20) NOT NULL,
Creditcard_expire DATETIME NOT NULL)
注意字段定义后面跟有表达式NOT NULL通过包含表达式NOT NULL你可以禁止任何人只在个字段中插入数据而不输入另个字段数据
你将会发现在你建设自己网点过程中这种禁止空值能力是非常有用如果你指定个字段不能接受空值那么当你试图输入个空值时会有警告这些警告可以为调试提供有价值线索

缺省值
假设有个存储地址信息这个表字段包括街道、城市、州、邮政编码和国家如果你预计地址大部分是在美国你可以把这个值作为country字段缺省值
为了在创建个表时指定缺省值你可以使用表达式DEFAULT请看下面这个在创建表时使用缺省值例子:

CREATE TABLE addresses (street VARCHAR(60) NULL,
city VARCHAR(40) NULL,
state VARCHAR(20) NULL
zip VARCHAR(20) NULL,
country VARCHAR(30) DEFAULT ‘USA’)

在这个例子中字段country缺省值被指定为美国注意单引号使用引号指明这是型数据为了给非字段指定缺省值不要把该值扩在引号中:

CREATE TABLE orders(price MONEY DEFAULT $38.00,
标签:

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: