瑞星卡卡安全论坛技术交流区系统软件 【推荐】SQL 21 日自学通-2

12345   2  /  5  页   跳转

【推荐】SQL 21 日自学通-2

UPDATE 语句
该语句的作用是将已存在的记录的内容改变语法格式如下
SYNTAX
UPDATE table_name SET columnname1 = value1 [, columname2 = value2]...
WHERE search_condition
UPDATE 语句首先要检查WHERE 子句对于符合WHERE 子句条件的记录将会用给
定的数据进行更新
gototop
 

例8.4
INPUT
SQL> UPDATE COLLECTION SET WORTH = 900 WHERE ITEM = 'STRING';
OUTPUT
1 row updated.
下边的查询可以用来验证确实已经进行了更新操作
INPUT/OUTPUT
SQL> SELECT * FROM COLLECTION WHERE ITEM = 'STRING'
ITEM WORTH REMARKS
STRING 900 SOME DAY IT WILL BE VALUABLE
下边是一个对多个记录进行更新的例子
INPUT/OUTPUT
SQL> update collection set worth = 900, item = ball where item = 'STRING';
1 row updated.
注你所使用的解释器的对多个记录进行更新的语法可能会与这里给出的并不相同
注注意在900 上没有加引号因为它是数值类型而在STRING 上则有引号因
为它是字符串
gototop
 

例8.5
如果在UPDATE 语句中省略了WHERE 子句那么给定表中的所有记录都会被更新
INPUT/OUTPUT
SQL> UPDATE COLLECTION SET WORTH = 555;
6 rows updated.
下边的SELECT 查询表明了表中的所有记录都已经被更新了
INPUT/OUTPUT
SQL> SELECT * FROM COLLECTION
ITEM WORTH REMARKS
NBA ALL STAR CARDS 555 SOME STILL IN BIKE SPOKES
MALIBU BARBIE 555 TAN NEEDS WORK
STAR WARS GLASS 555 HANDLE CHIPPED
SQL 21 日自学通(V1.0) 翻译人笨猪
167
ITEM WORTH REMARKS
LOCK OF SPOUSES HAIR 555 HASN'T NOTICED BALD SPOT YET
SUPERMANS CAPE 555 TUGGED ON IT
STRING 555 SOME DAY IT WILL BE VALUABLE
当然你也应该检查一下它是否也对具有唯一值属性的列进行了更新操作
警告如果你在UPDATE 语句中没有使用WHERE 子句那么所有给定表中的记录都会被
更新
一些数据库管理系统对标准的UPDATE语句进行了扩展SQL SERVER 的Transact-SQL
就是它们中的一个例子它允许使用FROM 子句实现对给定表的记录用其它表中的数据来
进行更新操作其语法表达如下
SYNTAX
UPDATE table_name SET columnname1 = value1 [, columname2 = value2]...
FROM table_list WHERE search_condition
gototop
 

例8.6
这是一个实例
INPUT
SQL> UPDATE COLLECTION SET WORTH = WORTH * 0.005
INPUT/OUTPUT
SQL> SELECT * FROM COLLECTION
ITEM WORTH REMARKS
NBA ALL STAR CARDS 2.775 SOME STILL IN BIKE SPOKES
MALIBU BARBIE 2.775 TAN NEEDS WORK
STAR WARS GLASS 2.775 HANDLE CHIPPED
LOCK OF SPOUSES HAIR 2.775 HASN'T NOTICED BALD SPOT YET
SUPERMANS CAPE 2.775 TUGGED ON IT
STRING 2.775 SOME DAY IT WILL BE VALUABLE
分析
该语法在当给定表需要更新的内容源自于其它多个表的时候非常有用切记该语法不
是标准语法在使用它之前请先查看一下你所使用的数据库的文档看一看它是否为你的数
据库系统所支持
UPDATE 语句也可以用一个数学运算式的结果来对给定数据进行更新操作当使用这
项技术时必须注意你所使用的表达式结果与需要更新的数据字段为同一种数据类型而
SQL 21 日自学通(V1.0) 翻译人笨猪
168
且其长度也要与被更新字段的定义长度相符
当使用计算值时可能会有两个问题产生截断和溢出例如当将一个小数转换为整数
时可能会有截断的情况产生而当计算的结果超过了该字段的定义数据长度时会导致溢出
这会使你的数据库返回一个错误
注一些数据库系统可以为你处理溢出问题ORACLE 7 可以在这时将其转成指数形式以
避免错误但是你要清楚在使用数据类型时这种错误存在的可能性
技巧如果在你更新列的以后发现了错误你可以使用ROLLBACK 语句来取消更新操作
就像你对INSERT 所做的那样关于该命令在第11 天会有更多的介绍
gototop
 

DELETE 语句
与向数据库中加入数据相对应你可能需要删除数据库中的数据DELETE 语句的语
法格式如下
SYNTAX
DELETE FROM tablename WHERE condition
对于DELETE 命令你需要注意的第一件事就是它不会出现确认提示而用户似乎已经
习惯于确认提示了举例来说当我们在操作系统中删除了某个文件或目录时Are you sure?
(Y/N)经常会在命令执行之前出现在使用SQL 时当你告诉DBMS 从表中删除一组记录
时它会执行你的命令而不提问也就是说当你用SQL 的DELETE 命令删除记录时
它确实已经执行了删除操作
在第11 天中我们将会学习到事务处理控制事务控制是一种数据库处理机制它允许
编程人员确认或撤消对数据库的改变该操作对于在线事务处理程序中采用批处理方式对
数据库进行改动时非常有效然而如果同一时间又有其他的用户也在进行数据修改操作时
将会导致引用完整性错误现在假设不存在事务处理机制
注对于一些解释器例如ORACLE 当你在即出SQL 的时候会自动地调用确认操作
通过DELETE 语句和WHERE 子句DELETE 语句可以完成下边的工作
l 删除单一的行
l 删除多个行
l 删除所有的行
SQL 21 日自学通(V1.0) 翻译人笨猪
169
l 什么也不删除
在使用DELETE 语句时需要注意以下几点
l DELETE 不能删除个别的字段它对于给定表只能整个记录整个记录地删除
l 与INSERT 和UPDATE 一样删除一个表中的记录可能会导致与其它表的引
用完整性问题当对数据库进行修改时一定在头脑中有这个概念
l DELETE 语句只会删除记录不会删除表如果要删除表需使用DROP TABLE
命令参见第9 天
gototop
 

例8.7
下例显示了如何删除COLLECTION 表中的WORTH小于275 的所有记录
INPUT
SQL> DELETE FROM COLLECTION WHERE WORTH < 275
4 rows deleted.
之后表的内容如下
INPUT/OUTPUT
SQL> SELECT * FROM COLLECTION
ITEM WORTH REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
STRING 1000 SOME DAY IT WILL BE VALUABLE
注与UPDATE 语句一样如果你省略了WHERE 子句那么表中的所有记录都会被删除
例8.8 中则使用了三种数据操作语句来完成一个数据操作过程
gototop
 

例8.8
INPUT
SQL> INSERT INTO COLLECTION VALUES('CHIA PET', 5,'WEDDING GIFT')
OUTPUT
1 row created.
INPUT
SQL> INSERT INTO COLLECTION
2 VALUES('TRS MODEL III', 50, 'FIRST COMPUTER');
OUTPUT
SQL 21 日自学通(V1.0) 翻译人笨猪
170
1 row created.
现在建立一个新表并向其中复制数据
INPUT/OUTPUT
SQL> CREATE TABLE TEMP (NAME CHAR(20), VALUE NUMBER, REMARKS CHAR(40))
Table created.
INPUT/OUTPUT
SQL> INSERT INTO TEMP(NAME, VALUE, REMARKS)
2 SELECT ITEM, WORTH, REMARKS FROM COLLECTION;
4 rows created.
INPUT/OUTPUT
SQL> SELECT * FROM TEMP;
NAME VALUE REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
STRING 1000 SOME DAY IT WILL BE VALUABLE
CHIA PET 5 WEDDING GIFT
TRS MODEL III 50 FIRST COMPUTER
现在改变其中的数值
INPUT/OUTPUT
SQL> UPDATE TEMP SET VALUE = 100 WHERE NAME = 'TRS MODEL III'
1 row updated.
INPUT/OUTPUT
SQL> UPDATE TEMP SET VALUE = 8 WHERE NAME = 'CHIA PET';
1 row updated.
INPUT/OUTPUT
SQL> SELECT * FROM TEMP;
NAME VALUE REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
STRING 1000 SOME DAY IT WILL BE VALUABLE
CHIA PET 8 WEDDING GIFT
TRS MODEL III 100 FIRST COMPUTER
然后将这些数据更新回原始表中
SQL 21 日自学通(V1.0) 翻译人笨猪
171
INPUT
INSERT COLLECTION SELECT * FROM TEMP
DROP TABLE TEMP
分析
关于CREATE TABLE 和DROP TABLE 语句将在第9 天作详细讨论现在这些语句
的作用基本上与它们的名字是一样的CREATE TABLE 会按照你给的格式建立一个新表
而DROP TABLE 则会删除表切记DROP TABLE 会删除中而DELETE 只会删除表中的记

为了验证你的工作你可以选出COLLECTION 表中的内容你会看到你改动后的结

INPUT/OUTPUT
SQL> SELECT * FROM COLLECTION;
NAME VALUE REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
STRING 1000 SOME DAY IT WILL BE VALUABLE
CHIA PET 8 WEDDING GIFT
TRS MODEL III 100 FIRST COMPUTER
分析
上边的例子使用了所有的操作数据的三个语句INSERT UPDATE 和DELETE 来对
一个表完成一组操作DELETE 是这三个语句中最容易使用的
警告切记对数据的操作可能会导致引用完整性问题你要认真地检查数据库中所有表的
所有记录以确保正确无误
从外部数据源中导入和导出数据
INSERT UPDATE和DELETE 语句对于数据库程序而言是非常有用的它与SELECT
语句一起为你将要进行的其它数据操作奠定了基础然而SQL 作为一种语言并不提供从
外部数据源中导入和导出数据的方法例如以前你的办公室用了多年的dBASE 数据库
而现在不准备再使用了你的领导想把它转为具有服务器/客户机功能的ORACLE 的
RDBMS 系统显然INSERT UPDATE 和DELETE 语句将会帮助你完成移植工作前提
是你想输入300,000 个记录幸运的是ORACLE 和其他的数据库制造商已经为你提供了完
SQL 21 日自学通(V1.0) 翻译人笨猪
172
成这种任务的工具
几乎所有的数据库系统都可以导入或导出ASCLL 码的文本文件尽管SQL 语言没有
这个功能SQL 不会做得比从一个空数据库开始更好我们可以使用下列产品中的导入和
导出工具它们是Microsoft Access Microsoft 和Sybase SQL Server 以及Personal Oracle7
Microsoft Access
Microsoft Access 是一个其于PC 的数据库产品它具有许多关系数据库管理系统的特
点Microsoft Access 也有强大的报表功能与Visual Basic 类似的宏语言以及从其他的数
据库系统和文本文件中导入或导出数据的能力本部分讲最后边的一种— — 从分界文本文
件中导入或导出数据分界的意思就为每个字段采用特殊的分界符来划定界限一般常用
的分界符是逗号引号和空格
Access 允许你从其他的数据库系统中导入和导出数据这些数据库系统包括dBASE
FoxPro SQL 数据库其中SQL 数据库其实是ODBC 数据链接Microsoft ODBC 将在第
13 天的高级SQL 主题中提到本例中我们讨论文本文件的导入导出过程
在打开Access 数据库以后使用文件|打开选择导出此时将会出现一个对话框
选择文本文件宽度固定选项Access 将会把数据库中的表导出到一个每一个数据类型
都有固定宽度的文本文件中例如如果字符字段宽度为30 就会向文本文件中输出一个长
为30 的字符串如果字符串不足30 就会用空格补足最后会问你文本文件的存放地
点下图显示了导入/导出对话框
SQL 21 日自学通(V1.0) 翻译人笨猪
173
注意在这个对话框中你可以选择文本宽度和字段分隔符最后一步是保存与使用有关
的注释内容注释会存储在数据库的内部
Microsoft and Sybase SQL Server
Microsoft 与Sybase 公司共同开发了新一代的功能强大的服务/客户数据库系统它就
是SQL Server Microsoft 已经同意了在一些平台上开发RDBMS 版本SyBase 则在其他平
台上已经开发了他的数据库版本通常是大型化的虽然在近几年协议有所改变但提到
这个协议可以让我们避免对近几年的数据库系统的版本混淆
SQL Server 提供的数据导入和导出的工具叫BCP BCP 是BULK COPY 的缩写
它的主要内容与ACCESS 的相同但是不幸的是BCP 需要你在提示符下输入命令而不是
在窗口中使用对话框
BCP 可以导出固定宽度的文本文件在SQL Server 中使用它导入文件要比使用ACCESS
直接但ACCESS 更容易使用BCP 使用格式化文本通常扩展名为.FMT 来存储导出
的说明说明文件告诉BCP 导出文件的列名字段宽度以及字段分隔符你可以当数据库
建好后在SQL 内部使用BCP 来建立一个关于数据库结构的说明
Personal Oracle7
Personal Oracle7 允许你导出文本文件文本文件的字段宽度与源库定义的字段宽度相
同使用的工具是SQL*Loader 这个图形工具使用一个控制文件扩展名为.CTL 这个
文件类似与SQL Server 的格式文件.FMT 它的内容是告诉SQL*Loader 数据文件的位

SQL*Loader 的界面见下图
SQL 21 日自学通(V1.0) 翻译人笨猪
174
总结
SQL 对于操作数据提供了三条语句
INSERT 语句有二个变体INSERT VALUES 可以插入一个记录而INSERT SELECT
则可以根据给定的一个或多个表来插入一个或多个记录SELECT 语句可以归并多个表
并把归并的结果加入到另外一个表中
UPDATE 语句可以改变符合条件列的值UPDATE 语句可以用计算或表达式的结果作
为需要更新的内容
DELETE 语句是这三个语句中最简单的它会删除符合WHERE 条件的所有记录如
果没有WHERE 子句它会删除表中的所有记录
现代的数据库系统提供了许多的数据库操作的工具其中一些工具可以让开发人员从
外部数据源中导入或导出数据这在当数据库向大系统或小系统上移植时非常有用
Microsoft Access Microsoft 和Sybase 的SQL Server 以及Personal Oracle7 都提供了这样的
移植工具
问与答
问SQL 有导入或导出操作的语句吗
答没有这一操作是解释器的附加功能也就是说ANSI 委员会允许制造商进行他
们认为是需要的工作
问我可以使用INSERT 语句从一个表中抟贝数据到它自身吗我想复制所有记录的
内容而只对其中一个字段的内容作更改
答不能INSERT 语句中的表不能与FROM 中的表相同但是你可以将它复制到
一个临时的表格中这将在第14 天讨论然后对临时表格的内容作修改后再将它复制回
原始表要检查你的表的具有唯一值属性的字段唯一值属性将只允许一个数值在该列中
出现一次
问我注意到了关于INSERT UPDATE 和DELETE 语句的警告是否我可以对我所
犯的错误进行修正如果是的话是那条语句可以完成这种工作
答是的例如你可以使用ROLLBACK 来撤消INSERT UPDATE 或DELETE 的
操作
SQL 21 日自学通(V1.0) 翻译人笨猪
175
但是如果你向表中插入了多个记录后没有发现错误就使用了COMMIT 命令几个星
期后别人发现了错误这时你可能要花上两个星期的时间来对数据库的数据进行逐条的检
查大多数情况下你可能不知道错在哪里所以你只好恢复数据库
校练场
1 下边的语句有什么错误
DELETE COLLECTION
2 下边的语句有什么错误
INSERT INTO COLLECTION SELECT * FROM TABLE_2
3 下边的语句有什么错误
UPDATE COLLECTION ("HONUS WAGNER CARD" 25000, "FOUND IT")
4 如果执行下边的语句会有什么结果
SQL> DELETE * FROM COLLECTION;
5 如果执行下边的语句会有什么结果
SQL> DELETE FROM COLLECTION;
6 如果执行下边的语句会有什么结果
SQL> UPDATE COLLECTION SET WORTH = 555
SET REMARKS = 'UP FROM 525';
7 下边的语句是否会工作
SQL> INSERT INTO COLLECTION SET VALUES = 900 WHERE ITEM = 'STRING'
8 下边的语句是否会工作
SQL> UPDATE COLLECTION SET VALUES = 900 WHERE ITEM = 'STRING'
练习
1 试着向一个表中插入一个不正确的数据类型看一下出错信息然后再插入一
个正确的数据类型
2 试着使用你的数据库系统将某个表导出为其他库格式然后再把它导入熟悉
一下你的数据库系统的导入与导出操作并试着用其它数据库操作导出文件
gototop
 

第九天创建和操作表
目标
在今天我们将学习创建数据库的知识在第九天我们将学习CREATE DATABSE
CREATE TABLE ALTER TABLE DROP TABLE 以及DROP DATABASE 语句它们被
子统称为数据定义语句与之相对应SELECT UPDATE INSERT DELETE 被称为数
据操作语句到今天结束之时我们将学会以下内容
l 建立关键字段
l 建立一个数据库以及在其中建表
l 表的建立修改与删除
l 向数据库中添加数据
l 修改数据库中的数据
l 删除数据库
从它的语法开始你现在已经知道了许多与SQL 有关的词汇并且知道对SQL 的一部
分已经有了详尽的了解在第二天的查询简介SELECT 语句的使用中我们学会了如
何从数据库中检索数据在第8 天操作数据中我们学习了如何从数据库中添加更新
和删除数据现在在第九天的学习过程中你将会知道数据库是怎么来的为了简单起
见我们忽略了数据库和表的建立过程我们假定这些东西已经存在于你们的系统之上
现在我们来建立它
CREATE 语句的语法可以非常简单或复杂它依据你的数据库管理系统的支持和你对
所要建立的数据库要求而定
注今天的例子使用的是PERSONAL ORACLE 7 请查看你所用的解释器的文档资料以了
解它们与本书中的例子在语法细节上的不同
CREATE DATABASE 语句
在任何数据库项目中管理数据的第一步工作就是建立数据库根据你的要求和你的数
据库管理系统的情况这个工作可以很简单也可以很复杂许多现代的数据库系统包括
SQL 21 日自学通(V1.0) 翻译人笨猪
177
PERSONAL ORACLE 7 都提供了图形工具例你可以通过按鼠标按键来完成数据库的建立
工作这对于节省时间是相当有益处的但是你应该知道SQL 是如何响应鼠标的操作的
典型的数据库创建语句如下
SYNTAX
CREATE DATABASE database_name
由于语法根据系统的不同差别很大所以我们不对CREATE 的语法作更深入的讨论
许多数据库系统甚至不支持数据库的创建命令但是几乎所有的流行了功能强大的关
系型数据库系统都支持它所以我们用创建数据库的选择来代替创建数据库命令的语法讨
论工作
建立数据库时的选项
CREATE DATABASE 语法的差别很大许多SQL 教材中都没有提到它而是直接进行
了CREATE TABLE 语句由于你在创建表之前必须先创建数据库而当一个开发人员在
建立数据库时必须要考虑一些事情第一件事情就是你的权限级别如果你使用的关系型
数据库管理系统支持权限你必须确认你是否具有系统管理设置权限或系统管理员已经允
许你有创建数据库的权限请参见你的数据库文档以获得更多的知识
大多数关系型数据库系统允许你指定数据库的默认大小它通常受你的硬盘容量的限
制你需要清楚你所使用的数据库系统是如何将数据根据你指定的大小存在你的硬盘上的
对空间的管理责任由每个系统管理人员负责所以你的本地的数据库管理人员为你建立一
个测试用的数据库是可能的
不要对CREATE DATABASE 过于关心它非常简单你可以像下边这样来建立一个
名字叫PAYMENTS 的数据库
SYNTAX
SQL> CREATE DATABASE PAYMENTS;
注再一次请你参考你所使用的数据库管理系统的说明书来建立数据库因为CREATE
DATABASE 语句在不同的解释器之间的差别是很大的每一种解释器都有它自己
的一些特点
SQL 21 日自学通(V1.0) 翻译人笨猪
178
设计数据库
设计数据库对于成功的应用来说是非常重要的它将涉及到我们在第一天学习的关系
型数据库理论和标准化数据库理论
标准化过程要求你将数据分解成不同的部分以减少数据的冗余度规划你的数据将是
一个非常复杂的过程有相当多的数据库设计工具可以让你将这一过程变得更合乎逻辑
许多因素会对你设计数据库造成影响如下边的
l 安全问题
l 磁盘的可用空间
l 数据检索及响应的速度
l 数据更新的速度
l 多表归并返回数据的速度
l RDBMS 对临时表的支持
磁盘空间是一个最为重要的因素尽管你可能会认为当磁盘的容量以GB 计时这是不
重要的不要忘记你的数据库越大返回数据库时间就越长如果你的表的设计工作做得
非常糟糕那么你可能会在其中存入许多无用的数据
相反的问题也会产生你可能已经建立了相当多的表所以看起来它们已经非常的合乎
标准化的要求了尽管你的数据库结构非常合理但是在这个数据库上进行的查询工作将
会花费相当多的时间数据库的设计风格有时会因为数据结构并不能清楚地表达设计人的
意图而使维护工作难于进行所以当你在进行代码和数据库的结构设计时将你的数据结构
与你当时的意图进行详细的记录是非常重要的在数据库设计行业中它被称为数据字典
建立数据字典
数据字典是数据库设计人员非常重要的文档资料它可以有以下功能
l 数据库的设计意图谁将会使用它
l 数据库的自身资料用什么创建的数据库数据库的大小是多少日志文件的尺
寸是多少在一些RDBMS 中它存储着数据库的操作信息
l 任何数据库安装或反安装的SQL 原代码记录包括导入/导出数据库的文档资料
记录就像第八天所说的那样
SQL 21 日自学通(V1.0) 翻译人笨猪
179
l 对每一个表的详细描述以及它的最终目的是什么
l 每一个表的内部结构的资料包括表中的所有字段数据类型以及注释情况以及
所有的索引和所有的视图见第10 天创建视图及索引
l 对于每一个存储过程的原代码和触发机制
l 说明数据库是否具有唯一值及非空值约束并说明这些约束是关系型数据库管理
系统强加的还是数据库编制人员设定的以及约束在原代码中的作用范围
许多计算机辅助软件工程工具会在建立数据字典的过程中为你提供帮助例如
MicroSoft Access 在将数据库打包会生成一个文档在文档中对数据库中的每一个细节都进
行了详细的描述在第17 天中的使用SQL 来生成SQL 语句中你了解数据字典的详细
内容
注大多数RDBMS 中都提供了生成数据字典的工具包或有说明来告诉你如何安装它
建立关键字段
在接下来的数据库设计工作中最主要的目标就是建立你的表的结构它包括主关键
字和外关键字其中主关键字用于完成下列目标
保证表中的第一条记录都是唯一的没有一条记录的内容完全与另一条相同至少主
键不能相同
对于一个特定的记录它的所有的列都是必须的列的内容不应出现重复
在第二个目标中如果列的内容在表中从头至尾都没有重复那它就是主关键字外
关键字则是在自己的关系中不唯一标识记录,但在其它关系中可用作对匹配字段链接的一种
关键字下边的例子可以帮助你来区分这两种情况
假定你有三个表BILLS BANK_ACCOUNTS COMPANY 它们的结构如下
Table 9.1. Table structure for the PAYMENTS database.
Bills Bank_Accounts Company
NAME, CHAR(30) ACCOUNT_ID, NUMBER NAME, CHAR(30)
AMOUNT, NUMBER TYPE, CHAR(30) ADDRESS, CHAR(50)
ACCOUNT_ID, NUMBER BALANCE, NUMBER CITY, CHAR(20)
BANK, CHAR(30) STATE, CHAR(2)
在Bills 表中的主关键字段为NAME 字段这一字段是没有重复的因为你只可能有
一个支票的来对应AMOUNT 实际上你可能通过支票号以及日期来保证它的唯一性但
SQL 21 日自学通(V1.0) 翻译人笨猪
180
在这里我们假定NAME 就能做到这一点而ACCOUNT_ID 字段则是BANK_ACCOUNT
的主关键字COMPANY表中的NAME 字段是主关键字
在本例中外部关键字应该是很容易发现的在BILL 表中的ACCOUNT_ID 与
BANK_ACCOUNT 表相关连而NAME 字段则将BILL 表与COMPANY 表相关连如果
这是一个完备的数据库你可能会有更多的表和数据分类例如BANK 字段在
BANK_ACCOUNT 表中可以说明一个银行的信息如地址和电话号码等COMPANY 表可
以与其它表或数据库事件相关连以得到公司及有关产品的信息
gototop
 

例9.1
同样用BILLS BANK_ACCOUNTS 和COMPANY 表我们来看一个不正确的数据库
设计初学者可能犯的错误就是不会正确地对数据进行尽可能的逻辑分组一个不好的BILL
设计如下
Column Names Comments
NAME CHAR(30) Name of company that bill is owed to
AMOUNT NUMBER Amount of bill in dollars
ACCOUNT_ID NUMBER Bank account number of bill (linked to BANK_ACCOUNTS table)
ADDRESS CHAR(30) Address of company that bill is owed to
CITY CHAR(15) City of company that bill is owed to
STATE CHAR(2) State of company that bill is owed to
结果看上去是正确的但是这只是在数据输入的开始时在几个月以后你已经在NAME
字段中输入了许多公司的账单每当向BILL 表中加入一个新记录的时候公司的
ADDRESS CITY 以及STATE 就有可能出现重复当记录增加到成千上万时重复的数据
也在相应的增加类似的情况也可能在10 20 或30 个表中出现你现在知道数据库标准
化设计的重要性了吧
在你向表中输入数据之前你应该知道如何来创建一个表
CREATE TABLE 语句
建立表的过程比建立数据库的过程更不标准它的基本语法如下
SYNTAX
CREATE TABLE table_name (field1 datatype [ NOT NULL ]
field2 datatype [ NOT NULL ]
SQL 21 日自学通(V1.0) 翻译人笨猪
181
field3 datatype [ NOT NULL ]...)
它的一个简单的例子如下
INPUT/OUTPUT
SQL>CREATE TABLE BILLS (
2 NAME CHAR(30)
3 AMOUNT NUMBER
4 ACCOUNT_ID NUMBER)
Table created.
分析
该语句创建了一个名字叫BILL 的表在BILL 表中有三个字段NAME ACCOUNT
和ACCOUNT_ID 其中NAME 字段为字符类型可以存储长度30 的字符串而AMOUNT
和AMOUNT_ID 则只参存储数字
下边的部分对CREATE TABLE 命令作进一步的解释
表名
当使用PERSONAL ORACLE 来创建一个表的时候对表的命名要遵从几个约束首
先表的名字不得超过30 个字符长由于ORACLE 对大小写不敏感所以在写名字时你
可以根据需要采用大写或小写的方式但是表的第一个字符必须是字母A-Z 其余的字
符则还可以有下划线# $ @ 当然在本工程中表的名字不应该有重复表的名字也
不可以是ORACLE 的保留字如SELECT
注你可以在不同的所有者或工程中使用相同的表的名字但在同一个工程中表的名字必
须保证唯一
FIRST NAME
如果你有过用任何一种语言进编程的经验你会有类似的关于数据类型的概念指定
的字段只能存放特定的数据类型例如字符型字段只能存放字符型数据类型表9.2 显
示了ORACLE 支持的数据类型
ORACLE 所支持的数据类型
SQL 21 日自学通(V1.0) 翻译人笨猪
182
数据类型说明
CHAR 可以存储长度为1~255 个字符的字符串空格会被填充到字符串的右边以保
证其内容满足定义的长度
DATE 包括日期的世纪年月日时分秒
LONG 可以支持长达2G 的字符串见下注
LONG RAW 可以存储长达2G 的二进制内容见下注
NUMBER 零正值或负值的定点或浮点数
RAW 可以存储长不过255 个字节的二进制代码
ROWID 用一个十六进制的数来标明当前行在表内的唯一地址见下注
VARCHAR2 变长的字母或数字长度可以从1 到2000
注LONG 数据类型在其它的数据库系统中常被称为备注类型它主要用于存储大量的可
以在稍后返回的文本内容
LONG RAW 类型在其它数据库系统中常被称为大二进制类型BLOB 它可以用
来存储图形声音视频数据尽管关系型数据库管理系统最初不是为它们而设计的但
是多媒体数据可以存储在BLOB 或LONG RAW 类型的字段内
ROWID 常用在可以将你的表中的每一条记录都加以唯一标识的场合许多关系型
数据库管理系统用COUNTER 如ACCESS 或IDENTITY SQL SERVER 来表达这个
概念
注请检查你的解释器看它们是否对数据类型的支持有所变化
空值属性
SQL 也可以让你鉴别在一个列中是否已经存入的数值NULL 只是一个修饰因为如
果一个字段的内容为NULL 的话实际上是说这个字段中没有东西也没有
在建立表的时候大多数数据库管理系统允许你用NOT NULL 来指明字段是否为非空
属性NOT NULL 的意思就是在当前表的该字段中不能有任何记录存在空值也就是说在
当前表中的该字段的每一个记录中都应该确实存在数值下例给出了NOT NULL 的用法
INPUT
SQL>CREATE TABLE BILLS (
2 NAME CHAR(30) NOT NULL,
SQL 21 日自学通(V1.0) 翻译人笨猪
183
3 AMOUNT NUMBER,
4 ACCOUNT_ID NOT NULL);
分析
在这个例子中如果你想把公司的账转到你自己的名下如果NAME 区和ACCOUNT_ID
区没有内容那么这种存储是没有任何意义的你也许可以在记录中给出账单号但是你
无法收取
下例中的第一个语句插入正确的数据以便为支付JOE 的$25 电脑服务费
INPUT/OUTPUT
SQL> INSERT INTO BILLS VALUES("Joe's Computer Service", 25, 1)
1 row inserted.
INPUT/OUTPUT
SQL> INSERT INTO BILLS VALUES("", 25000, 1)
1 row inserted.
分析
注意在上边的第二个例子中没有给出NAME 的名字你也许会认为这是一件好事
因为没有收款人却收取了25000 元但是我们不这样认为如果NAME 字段在创建时指
定的非空属性那么在第二个例子中就会产生一个错误
唯一属性
你在设计表时的一个目标是要保证在表中有一个列的值是唯一的这列或这个字段被
称为主关键字在一些数据库管理系统中允许你将某一列设成唯一值属性如ORACLE 和
SQL Server 可以让你对一个字段加以唯一值索引见第10 天这一特性可以保证你不
在该字段中插入重复的数值
在选择主关键字段时有几个需要注意的问题我们曾经说过ORACLE 提供了一个
ROWID 字段它对于每一行均会自动递增因此默认情况下它总是一个唯一的数值将
ROWID 字段作为主关键字有许多理由首先对于整数值的归并操作要远远快于对一个
长度为80 个字符的字符串的归并操作因为整数的存储长度小于字符串所以最终归并的
结果集也将小于字符串的归并结果集此外的一个好处是使用ROWID 字段你可以看到表
的组织情况而字符则会产生数字输入的问题例如当一个人输入了111 First Street 而
SQL 21 日自学通(V1.0) 翻译人笨猪
184
另一人输入了111 1st Street 时会有什么情况发生如果又有一个输入了111 1st St.呢在
今天的图形用户界面环境下正确的字符串会被输入到一个列表框中当用户从列表框中
选择的时候代码会将字符串变换成为一个唯一的ID 号并将这个号码存储在数据库中
到现在为止你可以用你在今天所学过的东西来创建一个表了随后我们将在今天使
用这些表所以你应该在表中输入一些数据使用昨天的INSERT 命令可以向表中加入表
9.3 9.4 和9.5 中的数据
INPUT/OUTPUT
SQL>create database PAYMENTS
Statement processed.
SQL>create table BILLS (
2 NAME CHAR(30) NOT NULL,
3 AMOUNT NUMBER,
4 ACCOUNT_ID NUMBER NOT NULL);
Table created.
SQL> create table BANK_ACCOUNTS (
2 ACCOUNT_ID NUMBER NOT NULL,
3 TYPE CHAR(30),
4 BALANCE NUMBER,
5 BANK CHAR(30));
Table created.
SQL> create table COMPANY (
2 NAME CHAR(30) NOT NULL,
3 ADDRESS CHAR(50),
4 CITY CHAR(30),
5 STATE CHAR(2));
Table created.
Table 9.3. Sample data for the BILLS table.
Name Amount Account_ID
Phone Company 125 1
Power Company 75 1
SQL 21 日自学通(V1.0) 翻译人笨猪
185
Name Amount Account_ID
Record Club 25 2
Software Company 250 1
Cable TV Company 35 3
Table 9.4. Sample data for the BANK_ACCOUNTS table.
Account_ID Type Balance Band
1 Checking 500 First Federal
2 Money Market 1200 First Investor's
3 Checking 90 Credit Union
Table 9.5. Sample data for the COMPANY table
Name Address City State
Phone Company 111 1st Street Atlanta GA
Power Company 222 2nd Street Jacksonville FL
Record Club 333 3rd Avenue Los Angeles CA
Software Company 444 4th Drive San Francisco CA
Cable TV Company 555 5th Drive Austin TX
表的存储与尺寸的调整
大多数RDBMS 都设定了表的默认大小和存储的定位如果你没有指定表的大小和存
储大小它就会采用默认值它可能是非常不合适的特别对于大型的表来说更是如此默
认大小根据解释器和不同而不同下边是一个在创建表时使用STORAGE 子句的例子对
于ORACLE 而言
INPUT
SQL> CREATE TABLE TABLENAME
2 (COLUMN1 CHAR NOT NULL,
3 COLUMN2 NUMBER,
4 COLUMN3 DATE)
5 TABLESPACE TABLESPACE NAME
6 STORAGE
7 INITIAL SIZE,
8 NEXT SIZE,
9 MINEXTENTS value,
SQL 21 日自学通(V1.0) 翻译人笨猪
186
10 MAXEXTENTS value,
11 PCTINCREASE value);
OUTPUT
Table created.
分析
在ORACLE 中你可以指定需要存放的表的大小定夺的依据是可用空间的大小经常
是由数据库管理人员来决定INITIAL SIZE 表的初始长度最初的分配空间NEXT SIZE
是指追加的长度MINEXTENTS 和MAXEXTENTS 用于指定表的最小和最大长度
PCTINCREASE 则指明表每次追加的百分比或进行下一次追加
gototop
 

用一个已经存在的表来建表
CREATE TABLE 是最为通用的建表的方法然而在一些数据库管理系统中提供了一
种可供选择的方法— — 使用已经存在的表中的格式和数据当你对表进行临时改动需要将
数据选出时这种方法是很有用的当你要创建的表与已有的表类似并且其内容也类似时它
也非常有用你不必须重新输入这些信息在ORACLE 中它的语法如下
SYNTAX
CREATE TABLE NEW_TABLE(FIELD1, FIELD2, FIELD3)
AS (SELECT FIELD1, FIELD2, FIELD3
FROM OLD_TABLE <WHERE...>
它的语法允许你建立一个字段类型与已有表中选出的字段类型相同的新表你也可以
对新表中的字段进行重命名
INPUT/OUTPUT
SQL> CREATE TABLE NEW_BILLS(NAME, AMOUNT, ACCOUNT_ID)
AS (SELECT * FROM BILLS WHERE AMOUNT < 50);
Table created.
分析
上边的语句用BILL 表中AMOUNT 小于50 的记录创建了一个新表
在一些数据库系统中你也可以使用下边的语法
SYNTAX
SQL 21 日自学通(V1.0) 翻译人笨猪
187
INSERT NEW_TABLE
SELECT <field1, field2... | *> from OLD_TABLE <WHERE...>
上边的语法格式将会严格地按照原有表的字段格式和数据建立一个新表下边用SQL
Server 的Transact-SQL 来对它进行举例
INPUT
INSERT NEW_BILLS
1> select * from BILLS where AMOUNT < 50
2> go
go 语句在SQL SERVER 中是处理SQL 缓冲区内指令的命令它的作用等同于在
ORACLE 中的分号
ALTER TABLE 语句
没有道理为每件事对你的数据库进行多次的设计但又确实需要对数据库和应用程序
进行改动那么ALTER TABLE 语句可以让数据库的设计者或设计人员在表创建以后修改
它的结构
ALTER TABLE 语句可以帮助你做两件事
l 加入一列到已经存在的表中
l 修改已经存在的表中的某一列
ALTER TABLE 语句的语法如下
SYNTAX
ALTER TABLE table_name <ADD column_name data_type; |
MODIFY column_name data_type;>
下边的命令会将BILL 表中的NAME 字段改为长度40 个字符
INPUT/OUTPUT
SQL> ALTER TABLE BILLS MODIFY NAME CHAR(40);
Table altered.
注你可以增加或减少某一列的长度但是你不能将它减少到使修改后的长度小于其中的
已有数据长度
下边的语句是向NEW_BILLS 表中加入一个新列
SQL 21 日自学通(V1.0) 翻译人笨猪
188
INPUT/OUTPUT
SQL> ALTER TABLE NEW_BILLS
2 ADD COMMENTS CHAR(80);
Table altered.
分析
这条语句会加入一个叫COMMENTS 的长度为80 个字符的字段该字段会加在已有
字段的右边
在使用ALTER TABLE 时会有许多限制你不能用它来对一个数据库增加或删除字段
它可以将一个列由NOT NULL改变为NULL而不必使用其它方法但是如果想把列由NULL
改变为NOT NULL 时则要求指定的字段中不能有NULL 值想把某一列由NOT NULL 改
变为NULL 可以使用下边的语法
SYNTAX
ALTER TABLE table_name MODIFY (column_name data_type NULL)
如果想把一列由NULL 改变为NOT NULL 你必需经过以下步骤
1 确认要改变的列中有没有NULL 值
2 删掉你所发现的任何NULL 值删除该记录更新这一记录等等
3 使用ALTER TABLE 命令
注在一些数据库管理系统中允许使用MODIFY 子句另外一些则不可以而又有
一些在ALTER TABLE 中加入了其它的子句在ORACLE 中你甚至可以修
改表的存储参数请检查你的解释器以找出它对ALTER TABLE 的确实用法
DROP TABLE 语句
SQL 提供了一个可以从数据库去彻底地移去某个表的命令DROP TABLE 可以从数据
库中删除一个指定的表以及与之相关联的索引和视图在第10 天会进行更详细的讨论
一旦这个命令发出以后就没有办法可以彻消它它最常用在你创建一个临时表并且已
经进行完毕了你的全部计划工作的时候DROP TABLE 语句的语法格式如下
SYNTAX
DROP TABLE table_name
下边是如何删掉一个叫NEW_BILLS 表的实例
SQL 21 日自学通(V1.0) 翻译人笨猪
189
INPUT/OUTPUT
SQL>DROP TABLE NEW_BILLS
Table dropped.
分析
请注意系统没有给出你提示该命令不会问你Are you sure? Y/N 但是删除操作
已经执行表已经永远地删除了
警告
如果你执行了
SQL> DROP TABLE NEW_BILLS
如果你想正确地删除一个表那么在删除表的时候最好给出它的所有都所属的数据
库或工程的名字推荐的使用方法如下
SQL> DROP TABLE OWNER.NEW_BILLS
我只所以强调这种使用方法是因为我曾经挽救过一个被错误删除了的表格它被删除
的原因是因为没有准确地给出其所属工程的名字修复那个数据库用了八个小时我们一
直工作到了深夜
DROP DATABASE 语句
一些数据库管理系统也提供了删除数据库DROP DATABASE 的语句它的使用方
法与DROP TABLE 相同语法如下
DROP DATABASE database_name
请不要删掉BILLS 数据库我们在今天的后边还要用它而且在第10 天也要用
注不同的关系数据库解释器提供了不同的删除数据库的方法在数据库被删除以后我
们需要清理掉操作系统用以构建数据库的文件
练习9.2
创建一个数据库并在其中创建一个表试验DROP TABLE 和DROP DATABASE 命令
数据库系统是否会允许你这样做单文件的数据库系统如ACCESS 是不支持这个命令的
数据库包含在一个单一的文件中如果想建立一个数据库你必须用系统提供的菜单选项
如果想删掉它只需简单地从系统中删掉这个文件就可以了
SQL 21 日自学通(V1.0) 翻译人笨猪
190
总结
第9 天讲述了数据处理语言DML 的主要内容具体说来是你学习了五个新的语句
CREATE DATABASE CREATE TABLE ALTER TABLE DROP TABLE DROP DATABASE
在今天的课程中我们也讨论了一个好的数据库设计方案的重要性
当你在创建并设计一个数据库的时候数据字典是一个重要的文档资料字典中有对数
据库的详细的描述包括表字段视图索引存储过程触发机制等等一个完备
的数据字典中应该有对数据库中的每一个内容的详细注释每当你对数据库进行过修改以
后你都应及时的更新数据字典
在使用数据库处理语句时设计一个好的数据库是非常重要的把数据分组逻辑组并
建立主关键字以使其它的逻辑组正确地识别它可以使用外部关键字来指向该表的主关键
字或在该表中用外部关键字与其它的表相关联
我们已经知道了建立数据库语句不是一个数据库系统的必需内容因为不同的数据库
供应商有不同的数据库组织形式每一种解释器都有它们自己的特点和选项从而导致了
建立数据库语句的截然不同只使用CREATE DATABASE database_name 可以在大多数系
统中用默认的参数来创建一个默认的数据库而DROP DATABASE 语句则可以永久地删
除一个数据库
使用CREATE TABLE 语句可以建立一个新的表使用该命令你可以建立字段并定义
它们的数据类型在一些数据库管理系统中你还可以指定字段的其它属性例如是否它可
以接受空值以及它的内容是否在本表中应该是唯一的而ALTER TABLE 语句可以对已存
在的表的结构进行修改DROP TABLE 语句可以永久地删除一个表格
问与答
问为什么CREATE DATABASE语句在不同的数据库中使用方法是不同的
答这是因为不同的数据库系统在建立数据库时的实际过程是不同的基于PC 机的
小型数据库系统通常依赖文件来建立某些应用程序而在大型服务器上运行的分
布式数据库中的需用数据库文件通常是分布在多个磁盘驱动器上的当你的代码
访问数据库的时候运行于电脑上的数据库程序不会像访问你的磁盘上的文件那
样直接更大的数据库系统还要对磁盘的空间进行估算以支持一些特性如安全性
SQL 21 日自学通(V1.0) 翻译人笨猪
191
传输控制以及内嵌于数据库的存储过程当你的程序访问数据库时数据库的服
务程序通常需要对你的请求通常与其它的请求一起经过复杂的中间过程才会
返回数据这一主题将在第3 周讨论现在你应该知道为什么不同的数据库系
统建立和管理数据库的方法不同的
问我能否建立一个临时表并且的工作完成后它会自动地删除
答可以许多数据库管理支持临时表的概念该类型的表可以在你的过程运行结束或你
使用DROP TABLE 语句后删除我们将在第14 天的动态应用SQL 中讨论临时表
问我是否可以用ALTER TABLE 语句来删除一个表
答不行该语句只可以用来增加或修改表中的某一列如果你想删除一列你可以建立
一个新表并将旧表中的数据有选择地复制到新表中然后再删除旧表
校练场
1 ALTER DATABASE 语句经常用在修改已有表的结构上对不对
2 DROP TABLE 语句与DELETE FROM <table_name>的作用是相同的对不对
3 可以使用CREATE TABLE 命令向数据库中加入一个新表对不对
4 为什么下边的语句是错误的
INPUT
CREATE TABLE new_table (
ID NUMBER
FIELD1 char(40)
FIELD2 char(80)
ID char(40)
5 为什么下边的语句是错误的
INPUT
ALTER DATABASE BILLS (
COMPANY char(80))
6 当一个表建立时谁是它的所有者
7 如果字符型列的长度在不断变化如何才能做出最佳的选择
8 表名是否可以重复
SQL 21 日自学通(V1.0) 翻译人笨猪
192
练习
1 用你喜欢的格式向BILLS 数据库中加入两个表名字分别叫BANK 和
ACCOUNT_TYPE BANK 表中应该包含有BANK_ACCOUNT 表中BANK 字段
的信息ACCOUNT_TYPE 表中也应该包含有BANK_ACCOUNT 表中
ACCOUNT_TYPE字段的信息试着尽可以地减少数据的数量
2 使用你已经创建的五个表BILLS BANK_ACCOUNTS COMPANY BANK
ACCOUNT_TYPE 改为表的结构以用整数型字段作为关键字以取代字符型字段
作为关键字
3 使用你所知道的SQL 的归并知识见第6 天表的归并写几个查询来归并BILLS
数据库中的几个表
gototop
 
12345   2  /  5  页   跳转
页面顶部
Powered by Discuz!NT